首页 > 解决方案 > 向 SQL 查询添加 JOIN 会产生不同的结果,这不是偶然的 CROSS JOIN

问题描述

这是表关系...

尝试学习 SQL 和以下查询:

SELECT a.id, a.name, w.channel, COUNT(*) use_of_channel
FROM accounts a
JOIN web_events w
ON a.id = w.account_id
GROUP BY a.id, a.name, w.channel
HAVING COUNT(*) > 6 AND w.channel = 'facebook'
ORDER BY use_of_channel;

返回 46 个结果(第一次查询结果),只需添加一个不相关表的 JOIN 即可返回 220 个结果。它不是CROSS JOIN,因为它似乎格式正确,只是在第 5 行添加了一个带有“orders”表的 JOIN

SELECT a.id, a.name, w.channel, COUNT(*) use_of_channel
FROM accounts a
JOIN web_events w
ON a.id = w.account_id
JOIN orders o
ON o.account_id = a.id
GROUP BY a.id, a.name, w.channel
HAVING COUNT(*) > 6 AND w.channel = 'facebook'
ORDER BY use_of_channel;

(第二次查询结果)

...但为什么另一张桌子会影响结果?

标签: mysqlsqljoin

解决方案


一个交叉连接。也就是说,每个帐户都有多个事件。每个账户都有多个订单。因此,在每个帐户中,您都会获得笛卡尔积。

解决此问题的一种快速方法是count(distinct)在主键上使用:

SELECT a.id, a.name, w.channel,
       COUNT(w.id) as use_of_channel

推荐阅读