我有一个包含订单的表和一个包含用户的表。可以通过用户表中的条目来下订单。
通过以下 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
,它也有效。
我的问题是:
- 为什么会返回重复字段?
- 使用 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.id
和 SELECT 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/