sql >> データベース >  >> RDS >> Mysql

すべての行が条件を満たすMySQLで選択

    @jjclarksonと@davethegr8からの回答は近いですが、WHERE句に集計関数を入れることはできません。 WHERE句は、行ごとに評価されます。

    MAX()を評価する必要があります 各グループの式なので、 HAVINGを使用する必要があります 条項。

    これを試してください:

    SELECT UserID 
    FROM ArrivalTimes
    GROUP BY UserID
    HAVING MAX(ArrivalTime) <= '09:00:00';
    

    @MBCookは、 HAVING 遅くなる可能性があります。そうです、それは望ましい結果を生み出すための絶対的な最速の方法ではないかもしれません。しかし、 HAVING 解決策は最も明確です 。パフォーマンスが明快さと保守性よりも優先度が低い状況があります。

    HAVING のEXPLAIN出力(MySQL 5.1.30)を確認しました 解決策:インデックスは使用されておらず、追加のメモには「temporaryを使用;filesortを使用」と記載されています。 、」これは通常、パフォーマンスが低下することを意味します。

    次のクエリについて考えてみます。

    SELECT DISTINCT a1.UserID
    FROM ArrivalTimes a1
      LEFT OUTER JOIN ArrivalTimes a2 
      ON (a1.UserID = a2.UserID AND a2.ArrivalTime > '09:00:00')
    WHERE a2.UserID IS NULL;
    

    これにより、 UserIDのインデックスを使用する最適化プランが生成されます そして言う:

    • a1:"インデックスを使用;一時的な "
    • a2:"使用場所;個別 "

    最後に、次のクエリは、インデックスを最も効果的に使用し、一時テーブルやファイルソートを使用していないように見える最適化プランを生成します。

    SELECT DISTINCT a1.UserID
    FROM ArrivalTimes a1
    WHERE NOT EXISTS (SELECT * FROM ArrivalTimes a2 
                      WHERE a1.UserID = a2.UserID 
                        AND a2.ArrivalTime > '09:00:00'); 
    
    • a1:"使用場所;インデックスの使用 "
    • a2:"使用場所 "

    これは、最高のパフォーマンスを発揮する可能性が最も高いようです。確かに、テストテーブルには4行しかないため、これは代表的なテストではありません。



    1. SQLServerで値に少なくとも1つの数値が含まれているかどうかを検出する方法

    2. SQL DROP DATABASE構文–DBMSによってリストされます

    3. データベース構造のリビジョン管理をどのように維持しますか?

    4. SQL接続文字列にカスタム属性を追加するにはどうすればよいですか?