…と言葉で書くととても分かりにくいのですが。
<追記>
全体的に加筆修正しました。
【環境】
MySQL(5.6)
【やりたいこと】
まず、data_table
テーブルに foo
と bar
のカラムがあり、
以下のようにデータが入っているとします。
buz
その他のデータも入っています。
PKは foo
と bar
の複合です。
------
foo bar buz
------
A 1 aaa
B 1 bbb
B 2 ccc
C 1 ddd
C 2 eee
------
このテーブルから、
「foo
の値(A,B,C)それぞれについて、
bar
が2であるレコード(なければ1であるレコード)」
を取得したいのです。
(また、ここでは1と2のうち2を優先して取る例としていますが、1と3のうち1を優先して取る、等の可能性もあります。
そのあたりはアプリケーション側で制御します。クエリの書き換えもある程度可能です。)
このような状態ですね。
------
foo bar buz
------
A 1 aaa
B 2 ccc
C 2 eee
------
現在のところ、
以下のようなクエリで一応は望むものが取得できているのですが
動作は保証されない書き方のはずです。
sql
1SELECT 2 `dt`.`foo`, `dt`.`bar`, `dt`.`buz` 3FROM 4 ( 5 SELECT `foo`, `bar`, `buz` 6 FROM `data_table` 7 ORDER BY `foo` ASC, `bar` = 2 DESC, `bar` = 1 DESC 8 ) AS `dt` 9GROUP BY `dt`.`foo`
これを改良するか、もしくは全く別の形でも構わないのですが、
正しい書き方はありますでしょうか?
<追記>
ご回答いただいた内容を参考にさせていただき、以下の形に落ち着きそうです。
(ちょっと長ったらしいですが、実装上の諸々の都合があり…。)
sql
1SELECT `data_table`.`foo`, `data_table`.`bar`, `data_table`.`buz` 2FROM `data_table` 3INNER JOIN 4 ( 5 -- ここの「MAX」をアプリ側で「MIN」に書き変える場合アリ 6 SELECT `foo`, MAX(`bar`) AS `bar` 7 FROM `data_table` 8 WHERE `bar` IN (1,2) 9 GROUP BY `foo` 10 ) AS `dt_sub` 11 ON `data_table`.`foo` = `dt_sub`.`foo` 12 AND `data_table`.`bar` = `dt_sub`.`bar`

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/01 06:33
2016/07/01 06:38
2016/07/01 07:08
2016/07/01 07:41 編集
2016/07/01 08:51