はじめに
前回の記事をご覧ください。
今回の例題にて用いるデータ
実行結果はこちらで確認できます。
用いるデータ
前回の記事をご覧ください。
今回の例題
members
テーブルには何かしらの行動が開始できるかどうかのステータスがデータ化されています。
この時「クラスの全メンバーが行動可能な状態(ready
)であることがわかるクエリ」を書いてください。
本日はCASE3を見ていきます。
CASE3
クエリ
- 以下のクエリは
- ある要素 (今回ならグループ化された各行(集合))の最大値と最小値が同じであることが
TRUE
である- ということは、その集合は1つの値(
status
)今回ならready
のみしかない
- ということは、その集合は1つの値(
- ことを利用しています
- 極値関数は、引数の列のインデックスを利用できるのでパフォーマンスもいいです
- ある要素 (今回ならグループ化された各行(集合))の最大値と最小値が同じであることが
SELECT class
FROM members
GROUP BY class
HAVING MAX(status) = 'ready' AND MIN(status) = 'ready'
結果
class |
---|
C |
D |
CASE4
別の視点ですが、集合に対する条件をSELECT句に移して、欲しい条件の集合かそうじゃないかのラベリングをつけるものいいでしょう
- OK,全員が
ready
- NO
クエリ
-- (MySQL v5.6)
SELECT
class,
CASE
WHEN MAX(status) = 'ready' AND MIN(status) = 'ready'
THEN 'TRUE' ELSE 'FALSE' END AS IS_READY
FROM members
GROUP BY class
結果
class | IS_READY |
---|---|
A | FALSE |
B | FALSE |
C | TRUE |
D | TRUE |
E | FALSE |
ただし、このクエリはMySQL(v5.6)までしか使えないでしょう(デフォルトの設定しかしていなければ)。
なぜならば、MySQL(v5.7)からはデフォでONLY_FULL_GROUP_BY
オプションが有効になっているからです。
有効の場合、GROUP BYするカラムだけしか参照できなくなります(無効だと、GROUP BYしたカラムじゃなくても参照できます)。
本日は以上です。
参照
123p
アウトプット100本ノック実施中