0

次のようなテーブルがあるとします。

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

問題は、私が1idに入るが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

websitefromcitytocityroundtripdepdate、およびを含む連結された主キーがあり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
4

1 に答える 1