0

データベース テーブル ('result') から結果のリストを取得しようとしていますが、各メンバーが複数の結果を送信している可能性があり、ベスト タイムを取得したいと考えています。

以下のクエリは機能します (ただし、効率的かどうかはわかりません)。ただし、同じ競技者から同じタイムで複数の結果が得られる場合を除きます。(例: 競技者 #2 はタイム 32.15 秒を 2 回記録します)。この状況では、私が望むものではなく、この競合他社に対して 2 つの行を取得します。

SELECT result_id FROM ( 
    SELECT member_id,MIN(time) AS mintime FROM result 
        JOIN member_result ON result.id = member_result.result_id 
        WHERE event_id = ? 
        GROUP BY member_id ORDER BY mintime ) AS x 
JOIN result ON result.time = x.mintime
JOIN member_result ON member_result.result_id = result.id
AND member_result.member_id = x.member_id

問題を解決するための提案は大歓迎です。

編集: 要求されたテーブルの構造;

member_result (TABLE)
 id int unsigned (10)
 result_id int unsigned (10)
 member_id int unsigned (10)
 club_id int unsigned (10)

result (TABLE)
 id int unsigned (10)
 time decimal (6)
 is50mPool BIT ()
 date date ()
 verified BIT ()
 verified_date timestamp ()
 verified_comment varchar (255)
 hasEmailed BIT ()
 enabled BIT ()
 event_id int unsigned (10

問題例: 結果: イベント#2 の id#1、時刻 60 member_result: id#1、結果 ID 1、メンバー ID 3 結果: イベント#2 の ID#2、時刻 60 member_result: id#2、結果 ID 2、メンバー ID 3

いずれかの result_id を使用して 1 つの行を返したいと思います。現在、最小時間が等しいため、両方の行が返されます。

4

3 に答える 3

1

編集:

ID でどちらがより興味深いかに応じて、MIN または MAX を使用することができます。その場合、行は 1 つしかありません。

お気に入り:

SELECT result_id FROM ( 
    SELECT member_id, MIN(member_result.id) as member_resultID ,MIN(time) AS mintime FROM result 
        JOIN member_result ON result.id = member_result.result_id 
        WHERE event_id = 2 
        GROUP BY member_id ORDER BY mintime ) 
AS x 
JOIN result ON result.time = x.mintime
JOIN member_result ON member_result.result_id = result.id
AND member_result.id = x.member_resultID

これは、最初のユーザーの特定のイベントの MIN 時間のみを返します。(したがって、2 行ではなく 1 行のみ)

これがSqlFiddleです。

于 2012-08-27T14:55:59.977 に答える
0
SELECT Distinct result_id FROM ( 
SELECT member_id,MIN(time) AS mintime FROM result 
    JOIN member_result ON result.id = member_result.result_id 
    WHERE event_id = ? 
    GROUP BY member_id ) AS x 
JOIN result ON result.time = x.mintime
JOIN member_result ON member_result.result_id = result.id
AND member_result.member_id = x.member_id 

これを試しましたか?

于 2012-08-27T14:40:05.353 に答える
0

Actually, this turned out to be as simple as grouping again on the outer query - something which didn't appear to work initially because of a LIMIT statement I had in place without an ORDER BY before the limit that because of the GROUP BY the query broke.

SELECT result_id FROM ( 
SELECT member_id,MIN(time) AS mintime FROM result 
    JOIN member_result ON result.id = member_result.result_id 
    WHERE event_id = ? 
    GROUP BY member_id ORDER BY mintime ) AS x 
JOIN result ON result.time = x.mintime
JOIN member_result ON member_result.result_id = result.id
AND member_result.member_id = x.member_id
GROUP BY member_result.member_id

Thanks to all those who contributed!

于 2012-08-29T18:32:06.937 に答える