次のようなテーブルがあるとします。
id | price | group1
1 | 6 | some_group
2 | 7 | some_group
3 | 8 | some_group
4 | 9 | some_other_group
グループ化された最低価格を選択したい場合group1
私はこれを行うことができます:
SELECT id, min(price), group1 FROM some_table GROUP BY group1;
問題は、次のように価格でソートされていないテーブルがある場合です。
id | price | group1
1 | 8 | some_group
2 | 7 | some_group
3 | 6 | some_group
4 | 9 | some_other_group
次に、クエリが次の結果セットを返します。
id | price | group1
1 | 6 | some_group
4 | 9 | some_other_group
問題は、私が1
列id
に入るがid
、価格の行の が で6
はない1
こと3
です。私の質問は、使用時に最低価格を含む行から値を取得するにはどうすればよいGROUP BY
ですか?
私はこれを試しました:
SELECT f.id, min(f.price), f.group1 FROM (SELECT * FROM some_table ORDER BY price) f
GROUP BY f.group1;
しかし、これは非常に遅く、複数の列と集計があると失敗する可能性があります。
上記の名前はデモンストレーションのみを目的としていることに注意してください。私の実際のクエリは次のようになります。
SELECT depdate, retdate, min(totalprice_eur) price FROM
(SELECT * FROM flight_results
WHERE (
fromcity = 30001350
AND tocity = 30001249
AND website = 80102118
AND roundtrip = 1
AND serviceclass = 1
AND depdate > date(now()))
ORDER BY totalprice_eur) F
WHERE (
fromcity = 30001350
AND tocity = 30001249
AND website = 80102118
AND roundtrip = 1
AND serviceclass = 1
AND depdate > date(now()))
GROUP BY depdate,retdate
website
、fromcity
、tocity
、roundtrip
、depdate
、およびを含む連結された主キーがありretdate
ます。他の指標はありません。
説明は次のように述べています。
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2837 Using where; Using temporary; Using filesort
2 DERIVED flight_results ALL PRIMARY NULL NULL NULL 998378 Using filesort