2010-09-07 21 views
3

我正在嘗試編寫一個查詢,以顯示每個孔的最小值(最低分數),從而消除任何重複項。換句話說,如果hole_num 1上的最小分數是3,並且有3個分數,那麼與hole_num 1對應的行都不應該返回。但是,如果hole_num 1上只有一個值爲3,並且它是最小值,則應該返回該行。這是我能夠想出...不幸的是,我不知道如何刪除重複。mysql select至少不是重複的

示例表:

player_id  hole_num  score 
------------- ------------ ----- 
1    1   4 
1    2   5 
2    1   3 
2    2   5 

我查詢得到的最低分數爲每個hole_num(但如果它發生不止一次沒有消除的行):

select. r.player_id, r.hole_num, r.score 
    from scorecard_test r 
    join (select hole_num, 
       min(score) best 
      from scorecard_test 
     group by hole_num) v on r.hole_num = v.hole_num 
          and r.score = v.best 

產生下面的輸出:

player_id hole_num score 
---------- --------- ----- 
1   2   5 
2   1   3 
2   2   5 

我想寫一個查詢,只會顯示第二行以上(score = 3),因爲hole_num 2上的5(儘管它是最小值)是重複。任何幫助將不勝感激。

+0

現在我明白了 - 你要的聯繫,只返回一個單一行。所以問題是 - 在重複的情況下,應該顯示(以及爲什麼)?爲什麼'player_id'在最終輸出中可見? – 2010-09-07 21:17:02

+0

同一個玩家是否可以多次玩同一個洞?如果是這樣,那麼得分可以相同嗎?它可能會不同嗎? – 2010-09-07 21:21:58

+0

我想我理解這樣的查詢背後的上下文;想想一個皮膚遊戲,其中每個洞的最低分數拿到這個洞的錢,但是如果有一個平局,那麼這個錢就會進入下一個洞。 – KeithS 2010-09-08 00:04:51

回答

1

一個MySQL的具體解決方案是將GROUP BY和HAVING COUNT(*)= 1添加到您的當前查詢:

SELECT r.player_id, r.hole_num, r.score 
FROM scorecard_test r 
JOIN 
(
    SELECT hole_num, MIN(score) best 
    FROM scorecard_test 
    GROUP BY hole_num 
) v 
ON r.hole_num = v.hole_num AND r.score = v.best 
GROUP BY hole_num, score 
HAVING COUNT(*) = 1 

,將工作更普遍的是一個解決方案,以增加一個加入找到唯一的行:

SELECT r1.player_id, r1.hole_num, r1.score 
FROM scorecard_test r1 
JOIN 
(
    SELECT hole_num, MIN(score) best 
    FROM scorecard_test 
    GROUP BY hole_num 
) v 
ON r1.hole_num = v.hole_num AND r1.score = v.best 
LEFT JOIN scorecard_test r2 
ON r1.hole_num = r2.hole_num AND r1.player_id != r2.player_id AND r1.score = r2.score 
WHERE r2.player_id IS NULL 

在這兩種情況下,結果是這樣的:

 
player_id hole_num score 
---------- --------- ----- 
2   1   3 
+0

我太親近了...正是我在找的東西。我沒有機會經常使用sql/mysql,但是我發現這些東西因爲某種原因而變得困難......我花了整整一天的時間來構建這個查詢,然後我就陷入了最後一部分 - 感謝您在整個完成過程中爲我行。 – Dan 2010-09-08 00:44:21

0

你可能會尋找這樣的:http://www.w3schools.com/sql/sql_distinct.asp

做SELECT DISTINCT ...應該返回一個單獨的行,所有已完成複製。

+0

示例中的player_id值是不同的 - 因此,除非從SELECT子句中省略該列,否則使用DISTINCT將不起作用。 – 2010-09-07 21:20:45

+0

從描述中可以看出,hole_num的每個值都需要一行。 – phreakocious 2010-09-07 21:22:55

+0

啊,我明白你的意思了......這將需要另一層SELECT。 – phreakocious 2010-09-07 21:25:08