seihin_idの最安値に対するkoujou_idと
seihin_idの最高値に対するkoujou_idを別々に求め、
seihin_id同士で結合すれば1つのSQLで求めることができます。
もちろん別々に求めても構いません。
SQL
1SELECT max_v.seihin_id,
2 max_v.max_koujou_id,
3 max_v.max_price,
4 min_v.min_koujou_id,
5 min_v.min_price
6FROM
7(
8 #max_priceのkoujou_idを求める
9 SELECT seihin_id,
10 koujou_id as max_koujou_id,
11 price as max_price
12 FROM nedan
13 WHERE (seihin_id, price) IN (
14 SELECT seihin_id, MAX( price ) as max_price
15 FROM nedan
16 GROUP BY seihin_id
17 )
18) max_v,
19(
20 #min_priceのkoujou_idを求める
21 SELECT seihin_id,
22 koujou_id as min_koujou_id,
23 price as min_price
24 FROM nedan
25 WHERE (seihin_id, price) IN (
26 SELECT seihin_id, MIN( price ) as min_price
27 FROM nedan
28 GROUP BY seihin_id
29 )
30) min_v
31where max_v.seihin_id = min_v.seihin_id
出力結果
seihin_id max_koujou_id max_price min_koujou_id min_price
1 2 120 3 90
1 2 120 4 90
2 3 333 1 111
もし同一seihin_idで同一価格のkoujou_idが存在していると上記結果のように、
同じseihin_idが繰り返してしまいます。
もし同一seihin_idを1行に表示するのであればgroup_concat関数を使って、
koujou_idを横に展開することができます。以下サンプルです。
SQL
1SELECT max_v.seihin_id,
2 max_v.max_price,
3 group_concat(distinct max_v.max_koujou_id separator ',') as max_koujou_id,
4 min_v.min_price,
5 group_concat(distinct min_v.min_koujou_id separator ',') as min_koujou_id
6FROM
7(
8 #max_priceのkoujou_idを求める
9 SELECT seihin_id,
10 koujou_id as max_koujou_id,
11 price as max_price
12 FROM nedan
13 WHERE (seihin_id, price) IN (
14 SELECT seihin_id, MAX( price ) as max_price
15 FROM nedan
16 GROUP BY seihin_id
17 )
18) max_v,
19(
20 #min_priceのkoujou_idを求める
21 SELECT seihin_id,
22 koujou_id as min_koujou_id,
23 price as min_price
24 FROM nedan
25 WHERE (seihin_id, price) IN (
26 SELECT seihin_id, MIN( price ) as min_price
27 FROM nedan
28 GROUP BY seihin_id
29 )
30) min_v
31where max_v.seihin_id = min_v.seihin_id
32GROUP BY max_v.seihin_id,
33 max_v.max_price,
34 min_v.min_price
出力結果
seihin_id max_price max_koujou_id min_price min_koujou_id
1 120 2 90 3,4
2 333 3 111 1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/17 15:17