Mysql 选择SUM()查询的MAX()
我正在尝试创建一个查询,该查询显示最大值以及总和查询中的团队名称。我试着四处搜索,大多数答案都使用了LIMIT和TOP 1,这并不是我真正想要的 从这个求和查询中:Mysql 选择SUM()查询的MAX(),mysql,mysql-workbench,Mysql,Mysql Workbench,我正在尝试创建一个查询,该查询显示最大值以及总和查询中的团队名称。我试着四处搜索,大多数答案都使用了LIMIT和TOP 1,这并不是我真正想要的 从这个求和查询中: SELECT Team_Name, SUM(SCORE) as Score_Total FROM SCORE, TEAM WHERE team.Team_ID = score.Team_ID GROUP BY Team_Name; 返回以下内容: +----------------+-------------+ | Team_
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name;
返回以下内容:
+----------------+-------------+
| Team_Name | Score_Total |
+----------------+-------------+
| Hackers | 332 |
| Hammer Time | 356 |
| Sharp Shooters | 406 |
| String Music | 355 |
+----------------+-------------+
当我尝试用下面的代码在sum查询中使用MAX函数时:
SELECT Team_Name, MAX(Score_Total)
FROM (
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name) s;
我明白了:
+-----------+------------------+
| Team_Name | MAX(Score_Total) |
+-----------+------------------+
| Hackers | 406 |
+-----------+------------------+
正如您所见,max值确实正确,但与max值对应的团队名称却不正确。我的代码有问题吗?考虑以下查询:
SELECT Team_Name, MAX(Score_Total), MIN(Score_Total)
FROM (
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name) s;
它应该返回哪个团队名称?总分最高的队还是总分最低的队?如果聚合是AVG()
,并且没有一行包含该值,该怎么办
团队名称不来自找到最大(或最小)值的行。事实上,MySQL允许一个模棱两可的查询。它返回列中许多团队名称中的一个,但返回哪个团队是任意的
请注意,“任意”并不意味着“随机”。实际上,MySQL返回它在组中找到的第一个值。但这不是保证行为的一部分,它只是实现的巧合。如果他们在将来的某个版本中更改了实现,并且它开始从组中返回不同选择的任意行,则不允许您抱怨。;-)
这种类型的查询实际上在大多数品牌的SQL和SQL标准中都是错误的。您可以通过设置SQL\u MODE=ONLY\u FULL\u GROUP\u BY
使MySQL的行为更严格地符合SQL标准
解决问题的最简单方法是:
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name
ORDER BY Score_Total DESC
LIMIT 1;
考虑这个查询:
SELECT Team_Name, MAX(Score_Total), MIN(Score_Total)
FROM (
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name) s;
它应该返回哪个团队名称?总分最高的队还是总分最低的队?如果聚合是AVG()
,并且没有一行包含该值,该怎么办
团队名称不来自找到最大(或最小)值的行。事实上,MySQL允许一个模棱两可的查询。它返回列中许多团队名称中的一个,但返回哪个团队是任意的
请注意,“任意”并不意味着“随机”。实际上,MySQL返回它在组中找到的第一个值。但这不是保证行为的一部分,它只是实现的巧合。如果他们在将来的某个版本中更改了实现,并且它开始从组中返回不同选择的任意行,则不允许您抱怨。;-)
这种类型的查询实际上在大多数品牌的SQL和SQL标准中都是错误的。您可以通过设置SQL\u MODE=ONLY\u FULL\u GROUP\u BY
使MySQL的行为更严格地符合SQL标准
解决问题的最简单方法是:
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name
ORDER BY Score_Total DESC
LIMIT 1;
考虑这个查询:
SELECT Team_Name, MAX(Score_Total), MIN(Score_Total)
FROM (
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name) s;
它应该返回哪个团队名称?总分最高的队还是总分最低的队?如果聚合是AVG()
,并且没有一行包含该值,该怎么办
团队名称不来自找到最大(或最小)值的行。事实上,MySQL允许一个模棱两可的查询。它返回列中许多团队名称中的一个,但返回哪个团队是任意的
请注意,“任意”并不意味着“随机”。实际上,MySQL返回它在组中找到的第一个值。但这不是保证行为的一部分,它只是实现的巧合。如果他们在将来的某个版本中更改了实现,并且它开始从组中返回不同选择的任意行,则不允许您抱怨。;-)
这种类型的查询实际上在大多数品牌的SQL和SQL标准中都是错误的。您可以通过设置SQL\u MODE=ONLY\u FULL\u GROUP\u BY
使MySQL的行为更严格地符合SQL标准
解决问题的最简单方法是:
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name
ORDER BY Score_Total DESC
LIMIT 1;
考虑这个查询:
SELECT Team_Name, MAX(Score_Total), MIN(Score_Total)
FROM (
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name) s;
它应该返回哪个团队名称?总分最高的队还是总分最低的队?如果聚合是AVG()
,并且没有一行包含该值,该怎么办
团队名称不来自找到最大(或最小)值的行。事实上,MySQL允许一个模棱两可的查询。它返回列中许多团队名称中的一个,但返回哪个团队是任意的
请注意,“任意”并不意味着“随机”。实际上,MySQL返回它在组中找到的第一个值。但这不是保证行为的一部分,它只是实现的巧合。如果他们在将来的某个版本中更改了实现,并且它开始从组中返回不同选择的任意行,则不允许您抱怨。;-)
这种类型的查询实际上在大多数品牌的SQL和SQL标准中都是错误的。您可以通过设置SQL\u MODE=ONLY\u FULL\u GROUP\u BY
使MySQL的行为更严格地符合SQL标准
解决问题的最简单方法是:
SELECT Team_Name, SUM(SCORE) as Score_Total
FROM SCORE, TEAM
WHERE team.Team_ID = score.Team_ID
GROUP BY Team_Name
ORDER BY Score_Total DESC
LIMIT 1;
当您在查询中未指定GROUPBY条件时,MySQL将返回任何随机值 如果希望从子查询中获取最大值,我建议您对数据集进行排序,然后仅获取第一行:
select team_name, score_total
from
(
select team_name, sum(score) as score_total
from score, team
where team.team_id = score.team_id
group by team_name
) as a
order by
score_total desc
limit 1;
有一点建议: 在对
where
子句执行笛卡尔连接和过滤的同时,使用连接。此外,按Id字段分组:
select team_name, score_total
from
(
select team_name, sum(score) as score_total
from
score as s
inner join team as t on s.team_id = t.team_id
group by
t.team_id
) as a
order by
score_total desc
limit 1;
更简单的方法是:
select team_name, sum(score) as score_total
from score as s inner join team as t on s.team_id = s.team_id
group by team_id
order by sum(score) desc
limit 1
当您在查询中未指定GROUPBY条件时,MySQL将返回任何随机值 如果希望从子查询中获取最大值,我建议您对数据集进行排序,然后仅获取第一行:
select team_name, score_total
from
(
select team_name, sum(score) as score_total
from score, team
where team.team_id = score.team_id
group by team_name
) as a
order by
score_total desc
limit 1;
有一点建议: 在对
where
子句执行笛卡尔连接和过滤的同时,使用连接。此外,按Id字段分组:
select team_name, score_total
from
(
select team_name, sum(score) as score_total
from
score as s
inner join team as t on s.team_id = t.team_id
group by
t.team_id
) as a
order by
score_total desc
limit 1;
更简单的方法是:
select team_name, sum(score) as score_total
from score as s inner join team as t on s.team_id = s.team_id
group by team_id
order by sum(score) desc
limit 1
当您在查询中未指定GROUPBY条件时,MySQL将返回任何随机值 如果你想要最大值f