-1

人々がそれを提出するテストがあり、その後、テストを完了するのに使用した秒数も提出されます。

これはクエリです:

SELECT *
FROM namethatchampion_stats
GROUP BY user
ORDER BY seconds ASC
LIMIT 100

これはテーブル構造です:

id | user | seconds | time

ユーザーが何度もテストを送信できるようにしたいのですが、これはユーザーが最初に送信したものだけをリストしています。したがって、ユーザーが投稿した秒数よりも良い時間を取得した場合、データベース内のその行は使用されず、ユーザーが投稿した最初の行のみが使用されます。

4

4 に答える 4

2

可能であれば、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 つのレコードを持っている場合、両方が返されることです。これらの重複を削除するには、さらに集計が必要になります (おそらく、同じスコアの最初または最後のテストで制限する必要があります)。

于 2013-03-08T13:36:50.287 に答える
1

私はあなたがすべての学生の最高のスコアを望んでいると仮定しますMIN(seconds). それがあなたが望むものなら、ここに方法があります:

SELECT user, MIN(seconds) AS best_score
FROM namethatchampion_stats
GROUP BY user
ORDER BY best_score ASC
    LIMIT 100 ;
于 2013-03-08T13:22:16.910 に答える
0

ステートメントでは、テストが提出された日付を含む列をORDER BY使用する必要があります。(完全な日付が含まれていると仮定します。時間だけの場合、これは窓から出ます)。timeseconds

于 2013-03-08T13:19:26.753 に答える
0

これにより、すべてのユーザーの最速時間が得られます。

SELECT user, MIN(seconds) 
FROM namethatchampion_stats
GROUP BY user 
LIMIT 100;

これはあなたが望んでいたものですか?

于 2013-03-08T13:21:59.860 に答える