Mysql 选择SUM()查询的MAX()

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_

我正在尝试创建一个查询,该查询显示最大值以及总和查询中的团队名称。我试着四处搜索,大多数答案都使用了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_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