勉強したことのメモ

webプログラマ見習いが勉強したことのメモ。

MySQLでカラム内容によって条件分岐させたい

   

MySQLでカラムの内容によって条件を分岐させたかった。またPHPで処理するのではなくMySQL文で完結させたかった。調べてみるとCASE文というのが使えそうだったので使い方と検証のメモ。

 

検証内容

楽天やamazonで買い物をし、その際にポイントが発生したとする。このポイントを性別や購入ジャンル、サイトによって以下の通り増加する。

男性→ポイント1.1倍

女性→ポイント1.2倍

amazonでdrinkを購入→1.2倍

amazonでfoodを購入→1.5倍

楽天でdrinkを購入→1.3倍

楽天でfoodを購入→1.6倍

最終的に性別毎の合計ポイントを算出したい。

 

テーブルの作成

以下テーブルを作成した。

idは通し番号、 pointは発生したポイント、sexは0が男性で1が女性、siteは購入サイト、genreは購入ジャンル、ymdは購入日とする。

 

適当にデータを作成する。作成後は以下の通り。

 

また、この時点での合計ポイントは以下の通り。

 

CASE文を使ってみる

まずは男性→1.1倍、女性1.2倍を算出してみる。SQL文と結果は以下の通り。

最初よく分からなかったけどCASE後のカラムが○○だった場合××に置き換えるみたいな形っぽい。上記だとsexカラムが0だった場合1.1に置き換えて、その前のpointと掛け算するという形。

さらにサイトと購入ジャンルで分岐させたい場合は入れ子にして使う。以下の通り。

凄く分かりづらい。CASEでsiteがamazonだった場合で尚且つgenreがdrinkだった場合は1.2倍、foodだった場合は1.5倍という形になる。

 

リファレンス

https://dev.mysql.com/doc/refman/5.6/ja/case.html

 

その他

分かりづらいけど使い道は多そう。Where句とかは普通に追加して検索できる。

 - MySQL

  関連記事

msyql-image
権限が無い場合のエラー

SQLでINSERTする際、見たことに無いエラーに遭遇した。 INSERT co ...

msyql-image
SQLで同じ値を複数のレコードに対してUPDATE

やりたかった事は、複数のレコードに対して 同じ値に更新したいというもの。 $sq ...

msyql-image
MySQLのエラーログ取得関数

場合によってログに出力させたい値が異なる場合があったのでメモ。 function ...

msyql-image
mysqlで正規化できない時はシリアライズ使う

アンケートか何かに機能追加している際、配列を カンマ区切りで結合して文字列でDB ...

msyql-image
MySQLでserver has gone~というエラー

MySQLで「MySQL server has gone away」というエラー ...

msyql-image
sshでMySQLの操作

今までMySQLを操作するときはphpmyadminから 行っていたけど、php ...

images
PHPからMySQLデータを取得した際に一括で配列に入れる方法

MySQLからデータを取得して、PHP側で配列に入れる際に今まで一個ずつ書いてい ...

msyql-image
MySQLでJOINの高速化

JOINで無茶苦茶悩んだのでメモ。 やりたかった事は、MySQLで ・テーブルA ...

msyql-image
MySQLで大文字小文字

半角英数字のみのフォームで入力した値を検索した際、 データに差異が発生。 [Aa ...

msyql-image
MySQLで速度改善

よく見るけど実際に対面してみて難しさが分かった。 150万件ほどのデータがあって ...