mysql - 将 GROUP BY 或 DISTINCT 与 LEFT JOIN 结合使用

标签 mysql group-by left-join

我有一个包含订单的表和一个包含用户的表。可以通过用户表中的条目来下订单。

通过以下 MySQL 语句,如果存在匹配的用户,我会得到订单的重复值:

SELECT o.id, u.id as 'user_id', u.name
FROM orders o
LEFT JOIN users u ON o.user_id = u.id
WHERE o.status = 'active'

如果我添加一个 GROUP BY o.id 就可以解决问题。

SELECT o.id, u.id as 'user_id'
FROM orders o
LEFT JOIN users u ON o.user_id = u.id
WHERE o.status = 'active'
GROUP BY o.id

如果我使用SELECT DISTINCT,它也有效。

我的问题是:

  1. 为什么会返回重复字段?
  2. 使用 GROUP BY 还是 SELECT DISTINCT 哪个更正确?

最佳答案

您的详细查询(返回每一行的查询,而不是使用 DISTINCT 或 GROUP BY 进行重复数据删除的版本)在 users 中查找与每行匹配的多个行在订单中。因此,它会尽职尽责地返回所有这些行。

要正确解决您的问题,您需要弄清楚为什么每个订单有多个 user 行。也就是说,对于 order.user_id 的某些值,有多个 users.id 值。

这对我来说有点奇怪,但我不明白你的数据模型。您可能需要调查此数据异常。传统模式将使每个用户能够下多个订单,但每个订单仅与一个用户相关。在该架构中,此查询将为每个订单生成一行,但仍包括没有订单的用户:

SELECT u.id AS user_id, o.id AS order_id
  FROM users AS u
  LEFT JOIN orders AS o ON o.user_id = u.id

难道这就是你想要的吗?

与某些人的看法相反,GROUP BYorders.idSELECT DISTINCTorders.id,users.id相同事物。事实上,您建议使用的 GROUP BY 误用了 notorious MySQL extension to GROUP BY.标准 SQL 将拒绝您的 GROUP BY。它只会接受GROUP BYorders.id,users.id,这确实相当于DISTINCT。

关于mysql - 将 GROUP BY 或 DISTINCT 与 LEFT JOIN 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32780496/

相关文章:

mysql - 为什么在 LEFT JOIN 中忽略 WHERE 条件?

sql - 两列性能问题的左外连接

mysql - 加入 3 个表并按用户对电影结果进行分组

MySQL 查询中的 PHP 变量

c# - 提交后读取的 ServiceStack Ormlite 事务有时会返回 null

sql - 查询考试成绩计算

SQL:在 group by 中按单列选择两列,只有条件

sql - 如何在 SQL Server 中按 YEAR-MM 对 DATE 字段进行分组?

MySQL-使用列值加入同一查询

php - 显示记录的性能问题