Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用GROUP BY按最大值(`field_name`)排序_Php_Mysql - Fatal编程技术网

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