- ニュースリリース
- PHP MySQL 条件によってWHERE句の内容を変更しよう
PHP MySQL 条件によってWHERE句の内容を変更しよう
14,076
SQLのSELECT文でデータを取得する時は可能であれば一回でほしい情報を全て取得したいですね。
ですが取得する値によっては取得の条件が違ったりして結局複数回に分けてSQL文を発行してしまったということは往々にしてあります。
例えば下記のようなテーブルがあったとします。
1 2 3 4 5 6 |
mysql> CREATE TABLE test_db.test_table ( id int, name varchar(20), sex int, age int ); |
作成済みの「test_db」データベースの中に「test_table」テーブルが作成されました。
このテーブルには、
- 「id」カラム
- 「name」カラム・・・お名前(例:山田太郎)
- 「sex」カラム・・・性別(1:男性、2:女性)
- 「age」カラム・・・年齢(例:29)
の4つのカラムが含まれます。
こちらのテーブルの中身を全件表示したい場合のSQL文は以下のようになります。
1 |
mysql> SELECT * FROM test_table ; |
ですが、もし「sex」(性別)が男性の場合は「age」(年齢)が18歳以上。女性の場合は20歳以上のみを取得したいという条件を組む場合は以下のようになります。
1 2 3 4 |
mysql> SELECT * FROM test_table WHERE ( sex = 1 AND age >= 18 ) OR ( sex = 2 AND age >= 20 ); |
少し複雑になりましたが、ここまでは特に問題なく1回のSQL文発行で済ませることが出来ました。
では更に条件追加で同じ性別、かつ、同じ年齢の方が2人以上いる場合は年齢の制限を-2緩和するという条件の場合はいかがでしょうか?以下に書いてみます。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> SELECT * FROM test_table T1 WHERE ( SELECT COUNT(*) FROM test_table T2 WHERE T2.sex = T1.sex AND T2.age = T1.age ) >= 2 AND ( ( T1.sex = 1 AND T1.age >= 16 ) OR ( T1.sex = 2 AND T1.age >= 18 ) ) OR ( SELECT COUNT(*) FROM test_table T2 WHERE T2.sex = T1.sex AND T2.age = T1.age ) < 2 AND ( ( T1.sex = 1 AND T1.age >= 18 ) OR ( T1.sex = 2 AND T1.age >= 20 ) ); |
こちらはまずWHERE区で同じ性別、かつ、同じ年齢のカウントを取得させて条件を満たしているかどうかを判別しています。
そして条件を満たしていたら先程書いたSQL文を真似て緩和した年齢制限を記載しています。
見た目が暑苦しくて嫌になりますよね?
それにこれでも対応できない状況というのは存在します。
例えば、条件を満たしていない場合は検索条件そのものが変わってしまう時は上記のSQL文では対応も出来ずに渋々SQL文を2度発行してから取得したデータをPHPでぐるぐる回して出力する~等、それもデータ量が多くなるとメモリリークの問題が発生するのでテンポラリテーブルを作って再度SQL文を発行する等の対応が必要な場合もあります。
こういう場合、私はCASE文を使って対応します。上記SQL文を例にすると以下のように書き直すことが出来ます。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> SELECT * FROM test_table T1 WHERE CASE WHEN ( SELECT COUNT(*) FROM test_table T2 WHERE T2.sex = T1.sex AND T2.age = T1.age ) >= 2 THEN ( T1.sex = 1 AND T1.age >= 16 ) OR ( T1.sex = 2 AND T1.age >= 18 ) ELSE ( T1.sex = 1 AND T1.age >= 18 ) OR ( T1.sex = 2 AND T1.age >= 20 ) END; |
行数でいうと今回は前のSQL文とそう変わってはいませんが、人数の縛りは1文で済んでいますね。
簡単に説明すると、「CASE WHEN」には人数が何人以上いるのかの条件が入ります。
そちらを満たしている場合の「THEN」に検索条件を書いています。
満たしていない場合は「ELSE」に検索条件を書いています。
こちらのCASE文は「ELSE IF」で更に検索条件を指定できますのでかなり重宝します。
更に更にこの条件ではデータを無条件に出力する~や逆に出力したくない等の時は、「1」か「0」を置いてあげればいいです。
1 2 3 4 5 6 7 8 9 |
mysql> SELECT * FROM test_table T1 WHERE CASE WHEN ( SELECT COUNT(*) FROM test_table T2 WHERE T2.sex = T1.sex AND T2.age = T1.age ) >= 2 THEN 1 ←全て出力 ELSE 0 ←全て非出力 END; |
注意点としてはあまり複雑にしすぎるとコードを見返す時に大変だし重くなります。
それは全てのコードに言えることではありますが簡単に手間いらずで直すには便利な方法ですね。
そもそも複雑なコードが必要な時は往々にしてテーブルの設計に問題がある場合がほとんどですが、そうも言ってられない時は上記の方法で応急処置をしてあげるのも手だと思います。では(‘ω’)ノ
Contact
-
お電話でのお問い合わせ
092-409-8282
9:00~18:00(日祝休)
- メールでのお問い合わせ