mysql - 在没有分组依据但有子查询的情况下获取总和

标签 mysql group-by sum subquery

例如我有两个表:

BALANCE             VS
╔══════╦══════╗     ╔══════╦═══════╗
║ V_ID ║ BAL  ║     ║ V_ID ║ NAME  ║
╠══════╬══════╣     ╠══════╬═══════╣
║    1 ║ 1000 ║     ║    1 ║ Carl  ║
║    1 ║  500 ║     ║    2 ║ Peter ║
║    1 ║ -200 ║     ╚══════╩═══════╝
║    2 ║  350 ║     
║    2 ║ 1000 ║     
╚══════╩══════╝

现在我完成了如下查询:

select 
    NAME,sum(BAL)
from VS,BALANCE
where VS.V_ID = BALANCE.V_ID
group by NAME

结果是:

╔═══════╦══════╗
║ NAME  ║ BAL  ║
╠═══════╬══════╣
║ Carl  ║ 1300 ║
║ Peter ║ 1350 ║
╚═══════╩══════╝

但我想知道它是如何没有“group by”子句的。类似子查询的东西。 我尝试了不同的东西,但我不知道它是如何工作的。我总是以结果结束,例如将所有值汇总到一行中,或者结果与上面类似但没有分组。

谁能帮帮我

问候

编辑:忘记求和()

最佳答案

要让您当前的 SQL 使用 GROUP BY 工作,您需要以下内容(即 SUM 聚合函数):-

select     NAME, SUM(BAL)
from VS, BALANCE 
WHERE VS.V_ID = BALANCE.V_ID
group by NAME

请注意,这只是对您的原始 SQL 进行了最低限度的修改,它仍然使用您编码的隐式连接。通常应避免隐式连接,最好使用显式 INNER JOIN....ON 语法:-

select NAME, SUM(BAL)
from VS
INNER JOIN BALANCE 
ON VS.V_ID = BALANCE.V_ID
group by NAME

如果你真的想避免 GROUP BY 那么可以使用子查询,但可能会更慢(因为它实际上必须对主查询返回的每一行执行额外的查询):-

select NAME, (SELECT SUM(BAL) FROM BALANCE WHERE BALANCE.V_ID = VS.V_ID)
from VS

编辑,以回应您对子查询的评论。

关联子查询有效地强制MySQL得到一个结果集,然后对结果集上的每一行执行另一个查询。大多数情况下,它们用于获取聚合值(例如与返回行上的行相关的字段的最大值,但主查询中的 GROUP BY 不可行)。

例如,如果您有一个用户的评论列表,但在每一行上您想知道该用户的最新评论的日期,您可以执行以下操作:-

SELECT users.user_name, comments.comment_date, (SELECT MAX(comment_date) FROM comments WHERE comments.user_id = users.id) AS latest_comment_date
FROM users
INNER JOIN comments
ON users.id = comments.user_id

这可以写成使用 GROUP BY 进行不相关的子查询,然后加入:-

SELECT users.user_name, comments.comment_date, latest_comment_date
FROM users
INNER JOIN comments
ON users.id = comments.user_id
INNER JOIN
(
    SELECT user_id, MAX(comment_date) AS latest_comment_date
    FROM comments
    GROUP BY user_id
) sub1
ON users.id = sub1.user_id

如果您要处理大量用户记录,这可能会更快。

但是,如果您只处理少量用户记录(并且确定该数量非常复杂),则获取所有最大评论日期将是不必要的开销,并且它会强制对子查询进行连接'可能会使用索引。

关于mysql - 在没有分组依据但有子查询的情况下获取总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24036508/

相关文章:

python - Pandas.DataFrame.resample 出现意外结果

r - R中字符串中由竖线分隔的数字总和

mysql - 结果表mysql中两行的总和

sql - 为什么这个 SQL 查询返回重复的记录,而数据库中没有重复的记录?

mysql - SQL。如何在同一张表的不同行中工作/比较/查找差异

php - 在 codeigniter 中获取不正确的查询

Scala:如何按时间戳将 Iterable[T] 分组为 Iterable[T]

sql - 按奇数结果分组

python - 如何根据位置对字典中的值求和?

php - 使用 PHP 和 MySQL 从数组插入多个值并将它们与单个值关联