mysql - 如何决定 GROUP BY 之后保留 JOINED 表中的哪些记录?

标签 mysql sql join group-by

我正在尝试左连接两个表并按 MySQL 中第一个表的字段进行分组。 如果第一个表中的每条记录在第二个表中有多行,则 GROUP BY 会消除除右侧表中的一个之外的所有记录。有没有办法确定它是哪一个?

给你一个具体的例子,我想获取一个用户列表,加上他们(例如)最昂贵的购买(或最近购买,或其他什么......)的ID,这似乎是一个简单的任务,但我很沮丧,完全不知道该怎么做!

表 1:用户

userId, userName
1       Frank
2       Sarah
3       Tim

表 2:采购

orderId, userId, value
1        3       14.99
2        2       9.99
3        3       79.99
4        1       2.99
5        2       14.99
<小时/>
SELECT * FROM Users LEFT JOIN Purchases ON Users.userId = Purchases.userId

将返回:

userId, userName, orderId, value
1       Frank     4        2.99
2       Sarah     2        9.99
2       Sarah     5        14.99
3       Tim       1        14.99
3       Tim       3        79.99

现在,如果我按 userId 分组,结果将是:

userId, userName, orderId, value
1       Frank     4        2.99
2       Sarah     2        9.99
3       Tim       1        14.99

在这种情况下有没有办法决定保留哪个 orderId 或者是否有完全其他更好的方法来做到这一点? 我尝试过一些类似 MAX() 的方法,但这始终只返回整个表的最高值,而不是针对每个用户单独返回。

提前感谢您,非常棒的 stackoverflow 社区!

最佳弗洛里安

最佳答案

在严格的 SQL 中,此查询无效,因为在 Group by 上下文中,您应该仅选择 group by 子句或聚合中包含的字段。 然而,Mysql 允许这种语法并将其处理为“我不关心这个字段”,您无法定义选择哪些行值。

但是您可以使用如下查询来完成此操作: 从用户 u LEFT JOIN 中选择 u.*,p.* ( SELECT userId, max(value) as max_value FROM Purchases GROUP BY userId) p ON u.userId = p.userId

关于mysql - 如何决定 GROUP BY 之后保留 JOINED 表中的哪些记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22959284/

相关文章:

ruby-on-rails - rails 4 中的多级连接

mysql - 相当复杂的 JOIN 中的重复列名

javascript - 执行多个查询后终止 mysql 连接

mysql - 我想获取所有大于数据库中给定日期的记录

mysql - 从条件中排除某些行

sql - 如何计算不同表中ID的出现次数

mysql - 如何解释这个警告

sql - 在 PostgreSQL 中将多对多关系转换为一对多关系

c# - XSLT 转换创建 StackoverflowException

mysql - 使用 LEFT 连接的 LIMIT 行