mysql - 向 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;
...但为什么另一张桌子会影响结果?
解决方案
这是一个交叉连接。也就是说,每个帐户都有多个事件。每个账户都有多个订单。因此,在每个帐户中,您都会获得笛卡尔积。
解决此问题的一种快速方法是count(distinct)
在主键上使用:
SELECT a.id, a.name, w.channel,
COUNT(w.id) as use_of_channel
推荐阅读
- pandas - 结合 nunique 和 where in pandas
- javascript - jszip创建图像的空txt文件并压缩它们
- python - 我收到不稳定的 API 警告并且还收到错误“pandas_datareader._utils.RemoteDataError: Unable to read URL:”
- javascript - 当您在方法上有编辑器时,TinyMCE 更新工具栏(初始化后)
- c# - 在删除和插入操作方面获取两个字符串之间的差异
- android - 检查布局是否为空android studio
- unix - 此代码片段创建的最大子进程数
- python - 谷歌云 - 节点 jS + Python。如何安装requirements.txt?
- javascript - 在我的网站中添加 google 或任何其他搜索引擎的搜索栏
- dart - 如何调整 ShowDialog 子项的大小