@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行しかないため、これは代表的なテストではありません。