Php 使用GROUP BY按最大值(`field_name`)排序
我目前正在一个足球网站上工作,我正在开发一个可以追溯到历史的功能,看看哪些球员每年进球最多 我有一个可行的解决方案,但我认为会有一个更简单有效的方法 以下是一些示例数据:Php 使用GROUP BY按最大值(`field_name`)排序,php,mysql,Php,Mysql,我目前正在一个足球网站上工作,我正在开发一个可以追溯到历史的功能,看看哪些球员每年进球最多 我有一个可行的解决方案,但我认为会有一个更简单有效的方法 以下是一些示例数据: ----------------------- year | name | goals ----------------------- 1 | player1 | 6 1 | player2 | 8 1 | player3 | 4 2 | player1 | 3 2 | player
-----------------------
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
使用下面的查询,我能够检索到所需数据的一部分
从表
中选择年
,最大(目标
)作为目标
但是,从名称
列中检索正确的值要困难得多,因为在诸如第3年这样的情况下,我必须使用组CONCAT
,其中有多个名称
等于目标
的最大值
目前,我正在使用两个查询来获得我想要的结果。我仍然在使用上面的查询,但随后使用一个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
所以你需要所有进球最多的球员。一种方法使用变量。另一个需要子查询。下面使用了一个相关子查询,但有几种编写方法:
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;
只需将初始查询连接回原始表:
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个目标。您看到缺少的双引号了吗??语法着色应该给你提示!这里任何明显的语法错误都完全是因为我对该网站不熟悉,并且适应了代码和报价系统。我已经得到了下面的答案,现在可以解决我的问题了。谢谢你的回复。效果非常好。我曾调查过
join
和union
,但都没有成功。这正是您所描述的,可能对其他有类似问题的人有用。然而,对我来说,利用GROUP_CONCAT
非常重要,因此,正如上面Gordon Linoff的解决方案所提供的那样,任何关系都是作为一个结果交付的。感谢您提供了一个替代方案。
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