2017-01-03 5 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 

Используя следующий запрос, я могу получить часть данных я требую.

ВЫБОР year, MAX (goals) КАК goals ОТ 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

Работает великолепно. Я заглянул в «join» и «union», но не добился успеха. –

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 появятся на третий год, каждый игрок будет иметь 7 голов.

+0

Это точно так же, как вы описываете и, вероятно, будет полезно для других людей с аналогичной проблемой. Для меня, однако, было жизненно важно использовать «GROUP_CONCAT», поэтому любые связи поставляются в качестве одного результата в соответствии с решением Гордона Линоффа выше. Благодарим вас за предоставление альтернативы. –