2016-04-17 81 views
0

多行選擇一個行我對這個問題1個相關的表,獎勵:基於一個場

---------------------------------------- 
| award        | 
---------------------------------------- 
| id | name | URL | country_id | point | 
---------------------------------------- 
    1 | A | a | 1   | 120 
    2 | A | b | 0   | 60 
    3 | A | b | 2   | 80 
    4 | B | c | 0   | 50 
    5 | B | d | 1   | 70 

我希望能夠獲得特定國家,相應的各類獎項的名單(同一獎項具有相同的名稱),其列爲point列的最高值。

因此,我嘗試通過點DESC命令我的請求,並按名稱分組,但它沒有做到這一點,我沒有得到正確的點數和正確的URL。

我知道我可以通過從表中獲取所有數據然後只保留具有最佳點數的行,但必須有一種方法可以僅使用SQL來完成此操作!

我嘗試的要求是:

SELECT name, URL, point FROM award WHERE country_id IN (0,1) ORDER BY point DESC GROUP BY name 

回答

0

這應該得到你在找什麼:

SELECT t1.* FROM award AS t1 
    INNER JOIN (SELECT name, MAX(point) AS point 
     FROM award 
     WHERE country_id IN (0,1) 
     GROUP BY name) AS t2 
    ON t1.name=t2.name 
     AND t1.point=t2.point; 

這裏是如何分解:

這是加入award表(標識爲t1),子查詢標識爲t2。子查詢如下所示:

SELECT name, MAX(point) AS point 
    FROM award 
    WHERE country_id IN (0,1) 
    GROUP BY name 

子查詢將返回每個名稱的最大點數。下面是子查詢的結果:

+------+-------+ 
| name | point | 
+------+-------+ 
| A | 120 | 
| B | 70 | 
+------+-------+ 

顯然,這並不包括URL。如果確實如此,那麼URL必須位於GROUP BY之後,那麼您的輸入將是nameURL的唯一組合(然後您將無法獲得最大分值)。

下一步是基本加入到這個臨時表中,以獲得匹配的award表中的行。

INNER JOIN (...) AS t2 
    ON t1.name=t2.name 
     AND t1.point=t2.point; 

的加盟認定在award表中的行,其中的子查詢的結果namepoint匹配namepoint。這給了我們所需的完整行 - 我們現在可以訪問URL。結果是這樣的:

+------+------+------+------------+-------+ 
| id | name | URL | country_id | point | 
+------+------+------+------------+-------+ 
| 1 | A | a |   1 | 120 | 
| 5 | B | d |   1 | 70 | 
+------+------+------+------------+-------+ 

此外,在這一點上,你可以通過列在你想要的award表的順序,例如名稱:

ORDER BY t1.name 

或最高點值:

ORDER BY t1.point DESC 
+0

它爲我工作,但也有可能是,如果有使用相同的名稱和相同數量的點不同的行了一個問題:URL可能是錯誤的(不是從良行)。 – hellimac

+0

你想在這種情況下返回哪一行(即哪一行是「好行」)?如果您將country_id包含在group中並加入,那麼您將獲得每個國家/地區的最大分數。不知道這是你在找什麼。 – markwatsonatx

0

如果你想點遞減,嘗試

SELECT name, country_id, point 
FROM `award` 
WHERE country_id IN (0,1) 
GROUP BY name, country_id 
ORDER BY name, point DESC 

結果

name |country_id |point 
    =====|============|=========== 
    A |1   |120 
    A |0   |60 
    B |1   |70 
    B |0   |50 
+0

我想我的問題還不夠清楚。這裏的目標是每個名稱只有一行,即具有最高價值的一行。 – hellimac