当サイトではCookieを使用します。Cookieの使用に関する詳細は「プライバシーポリシー」をご覧ください。
OK
 
2018.08.17

PHP MySQL 条件によってWHERE句の内容を変更しよう

12,692

SQLのSELECT文でデータを取得する時は可能であれば一回でほしい情報を全て取得したいですね。
ですが取得する値によっては取得の条件が違ったりして結局複数回に分けてSQL文を発行してしまったということは往々にしてあります。
例えば下記のようなテーブルがあったとします。

作成済みの「test_db」データベースの中に「test_table」テーブルが作成されました。
このテーブルには、

  • 「id」カラム
  • 「name」カラム・・・お名前(例:山田太郎)
  • 「sex」カラム・・・性別(1:男性、2:女性)
  • 「age」カラム・・・年齢(例:29)

の4つのカラムが含まれます。

こちらのテーブルの中身を全件表示したい場合のSQL文は以下のようになります。

ですが、もし「sex」(性別)が男性の場合は「age」(年齢)が18歳以上。女性の場合は20歳以上のみを取得したいという条件を組む場合は以下のようになります。

少し複雑になりましたが、ここまでは特に問題なく1回のSQL文発行で済ませることが出来ました。
では更に条件追加で同じ性別、かつ、同じ年齢の方が2人以上いる場合は年齢の制限を-2緩和するという条件の場合はいかがでしょうか?以下に書いてみます。

こちらはまずWHERE区で同じ性別、かつ、同じ年齢のカウントを取得させて条件を満たしているかどうかを判別しています。
そして条件を満たしていたら先程書いたSQL文を真似て緩和した年齢制限を記載しています。
見た目が暑苦しくて嫌になりますよね?
それにこれでも対応できない状況というのは存在します。
例えば、条件を満たしていない場合は検索条件そのものが変わってしまう時は上記のSQL文では対応も出来ずに渋々SQL文を2度発行してから取得したデータをPHPでぐるぐる回して出力する~等、それもデータ量が多くなるとメモリリークの問題が発生するのでテンポラリテーブルを作って再度SQL文を発行する等の対応が必要な場合もあります。

こういう場合、私はCASE文を使って対応します。上記SQL文を例にすると以下のように書き直すことが出来ます。

行数でいうと今回は前のSQL文とそう変わってはいませんが、人数の縛りは1文で済んでいますね。
簡単に説明すると、「CASE WHEN」には人数が何人以上いるのかの条件が入ります。
そちらを満たしている場合の「THEN」に検索条件を書いています。
満たしていない場合は「ELSE」に検索条件を書いています。

こちらのCASE文は「ELSE IF」で更に検索条件を指定できますのでかなり重宝します。
更に更にこの条件ではデータを無条件に出力する~や逆に出力したくない等の時は、「1」か「0」を置いてあげればいいです。

注意点としてはあまり複雑にしすぎるとコードを見返す時に大変だし重くなります。
それは全てのコードに言えることではありますが簡単に手間いらずで直すには便利な方法ですね。
そもそも複雑なコードが必要な時は往々にしてテーブルの設計に問題がある場合がほとんどですが、そうも言ってられない時は上記の方法で応急処置をしてあげるのも手だと思います。では(‘ω’)ノ

Contact