可能であれば、MySQL によって提供される暗黙的なグループ化を避けることをお勧めします。これは、集計関数または group by 句に含まれていなくても、クエリID
で 、Time
およびを選択できることを意味します。seconds
この声明では:
SELECT *
FROM namethatchampion_stats
GROUP BY User
ORDER BY Seconds
ユーザーごとに 1 つの行を (ランダムに) 与えてから、これらのランダムな行を秒単位で並べ替えます。
MySQL ドキュメントの状態
サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、ORDER BY 句を追加しても、各グループからの値の選択に影響を与えることはできません。
そのため、集計から除外された列とグループ化が、グループ化に含まれる列 (主キーなど) に機能的に依存していない限り、明示的なグループ化を使用します。テーブルからすべての行を取得するシナリオでは、次を使用できます。
SELECT stat.ID,
stat.User,
stat.Seconds,
stat.Time
FROM NamethatChampion_stats Stat
INNER JOIN
( SELECT User, MIN(Seconds) AS Seconds
FROM NamethatChampion_stats
GROUP BY User
) MaxStat
ON MaxStat.User = stat.User
AND MaxStat.Seconds = stat.Seconds
ORDER BY Seconds ASC
LIMIT 100
SQL Fiddle の例
上記の方法の欠点は、ユーザーが同じ最速タイムの 2 つのレコードを持っている場合、両方が返されることです。これらの重複を削除するには、さらに集計が必要になります (おそらく、同じスコアの最初または最後のテストで制限する必要があります)。