▼すべてのカテゴリーを見る

【MySQL】WHERE句で年齢条件に合ったレコードを誕生日から取得する

webprogrum_eye

MySQLのテーブルに年齢カラムを設定しておらず、誕生日のみ登録されている。
このような状況で、WHERE句を用いた年齢条件検索を実行しようとするといろいろと面倒なのでメモ。

phpからSQL文を投げるのであれば、後半に書いた方法なんかもあります、というお話。
あまりスマートではないので、年齢カラムを作成してclonとか使って自動更新化した方がほんとは良いかも。

誕生日カラムで生じる面倒事と対策

phpからPDOなどでSELECTする場合に、WHERE句にASでリネームしたカラム名を入れて、

などとやってもエラーが出る。
【Unknown column ‘age’ in ‘where clause’】

WHERE句にはSELECTの際にASでリネームした名前を入れて検索することはできない
その場合、

としてもいいが、DATE型のデフォルト値である”0000-00-00″が存在する場合、「2016歳」として取得してしまうので、
AND birthday != ‘0000-00-00’ をくっつけておいた方がいいかも。
どちらにせよ、あんまりきれいなクエリじゃないですね。。

phpからSQLを投げる場合

上記のようにSQL側で年齢計算をさせるのもいいですが、phpからSQLを投げるのであれば、現在の日付から逆算して比較することもできます。

完成形のイメージ

最終的に投げたいのは、

というような形です。

WHERE句、比較演算の右辺は19900704になっている(ハイフンを抜いている)のは、DATE型やDATETIME型での比較が上手くいかないことがあるからです。
なんとなく文字列として比較しているようで、数値として比較しているとは思えない結果になってしまいます。

誕生日と比較する数値を作成する

ざっくり紹介。webフォームに年齢条件のプルダウンがあり、name=’age’、value=26をPOSTしたときの処理として書いています。
今日の日付は2016/07/04とします。

これを、

にくっつけるだけ。

わざわざ分けたのは、条件が増えたときのためです。
もっとシンプルに書けると思いますが、とりあえず考え方だけ。

どちらが早いか、どちらが見やすいかとかは無視してますが、検索条件が複雑になるとSELECTが重くなりそうなので、少しでも負荷の低いSQLを投げたいなーと思ってこんな感じになりました。
以上です。

面白かったら、役に立ったら、何も感じなかったら「いいね!」してね!

仕事そっちのけで記事を書いた人

プログラムしたりトレードしたりスケートしたりけん玉したりするひと。趣味はトライアンドエラー。優しいときもあれば厳しいときもある。寝不足を基本とする。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です