MySQLでとあるカラムの中の最小値や最大値を取得したい場合には、MIN()やMAX()を使えば実現できる。
SELECT MIN(age) FROM users
ユーザーテーブルの中に年齢を持っておくカラムがあったとして、最少年齢はいくつなのかを取るとしたら、上記のような感じになると思う。
ここで、もし男女別にカラムが分かれていて、両方のカラムの中から最小値、あるいは最大値を取得したいときにはどうするか。
そういうときは、LEAST()やGREATEST()で解決できる。
SELECT LEAST(man_age, woman_age) FROM users
一つのユーザーデータの中に男女別の年齢が入っているなんて、まずありえない構成だとは思いますけどね。男性としての年齢と女性としての年齢を同時に持つ人…完全に新人類じゃん。ニューカマーじゃん。いや、多重人格者なら、性別と年齢の違う人格を備えていることも…まあそこは何でもいいです。
いい例が思い浮かばなかったので、今回はこれでいきましょう。
ちなみにこの書き方だと、各レコードのman_ageとwoman_ageのデータのうち、値の小さい方を持ってくるだけになってしまうので、全データの中で最小値を持ってくるのであれば、これとMIN()を組み合わせるといい。
SELECT MIN(LEAST(man_age, woman_age)) FROM users
何かもっといい書き方があるような気もするけれど、とりあえずこれで複数のカラムの中での最小値やら最大値を取得することは可能になる。
ただ、一つ注意が必要なのは、データの中にNULLが入っていると、どんな数値が入っていても最小値や最大値にはNULLが返ってきてしまう。LEAST()やGREATEST()ってのは、そういう風に動作する関数らしい。
今までLEAST()やGREATEST()という関数の存在を知らなかったから、こいつを使えばいけるじゃんと思いつつも、構成的にNULLを許可しないわけにはいかない仕様のせいで、残念ながら今回はこのやり方を生かすことはできませんでした。が、これは別の機会に使える日が来るような気がするので、忘れないうちにここにメモっておきたいと思います。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。