2017-01-03 125 views
1

我目前正在研究一個足球網站,並且我正在開發的一項功能可以追溯歷史記錄,以查看哪個球員每年進球數最多。ORDER BY MAX(`field_name`)使用GROUP BY

我有一個工作解決方案,但認爲會有一個更簡單和有效的方法去實現它。

下面是一些示例數據:

----------------------- 
year | name | goals 
----------------------- 
    1 | player1 | 6 
    1 | player2 | 8 
    1 | player3 | 4 
    2 | player1 | 3 
    2 | player2 | 5 
    2 | player3 | 2 
    3 | player1 | 7 
    3 | player2 | 7 
    3 | player3 | 3 

使用下面的查詢,我能找回我所需要的數據的一部分。

SELECT year,MAX(goals)AS goals FROM table GROUP BY`一年

------------ 
year | goals 
------------ 
    1 | 8 
    2 | 5 
    3 | 7 

檢索從name列正確的值被證明更加困難雖然,因爲我不得不使用GROUP_CONCAT在例如3年的情況下,其中多於一個的name等於最大值goals

目前,我正在使用兩個查詢來獲得我想要的結果。我仍在使用上面的查詢,但隨後使用PHP while循環單獨搜索每年。

這裏是我的代碼:

$load_goals = $db->query("SELECT `year`, MAX(`goals`) AS `goals` FROM `table` GROUP BY `year` DESC); 

while($goals = $load_goals->fetchObject()) 
{ 
    $players = $db->prepare("SELECT `year`, GROUP_CONCAT(`name` ORDER BY `name`) AS `name`, `goals` FROM `table` WHERE `year` = :year AND `goals` = :goals"); 
} 

我一直在努力,這兩個查詢合併爲一個,但無濟於事,所以這裏的任何指導,將不勝感激。

爲了澄清,這應該是我的最終結果。請注意在第3年發生了什麼,其中GROUP_CONCAT已送達。

------------------------------ 
year | name   | goals 
------------------------------ 
    1 | player2   | 8 
    2 | player2   | 5 
    3 | player1,player2 | 7 
+0

你看到缺少的雙引號嗎?語法着色應該給你提示! – RiggsFolly

+0

這裏的任何明顯的語法錯誤純粹取決於我對網站的新手和適應代碼和報價系統。 我已被提供以下答案現在解決我的問題。感謝您的答覆。 –

回答

1

因此,您希望所有擁有最大目標數的球員。一種方法使用變量。另一個需要一個子查詢。下面以相關子查詢,但有幾個方法可以這樣寫:

SELECT year, goals, GROUP_CONCAT(name ORDER BY name) as names 
FROM table t 
WHERE t.goals = (SELECT MAX(t2.goals) AS goals 
       FROM table t2 
       WHERE t2.year = t.year 
       ) 
GROUP BY year, goals; 
+0

工作出色。我曾研究過「加入」和「聯盟」,但都沒有成功。 –

0

剛剛加入您的初始查詢回到原來的表:

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT year, MAX(goals) AS goals 
    FROM yourTable 
    GROUP BY year 
) t2 
    ON t1.year = t2.year AND 
     t1.goals = t2.goals 

使用這種方法,將有多個記錄多年來擁有不止一名球員與最多的進球數相關聯。例如,如果您針對您的樣本數據集運行此查詢,則第1和第2名球員都會在第3年出現,每位球員有7個球門。

+0

這與您所描述的完全相同,並可能用於其他具有類似問題的人。 然而,對於我來說,使用'GROUP_CONCAT'是非常重要的,因爲任何關係都是作爲一個結果提供的,正如Gordon Linoff的解決方案所提供的。 感謝您提供替代方案。 –