MySQL,在执行 SELECT DISTINCT 查询之前合并 2 个或更多表?
Posted
技术标签:
【中文标题】MySQL,在执行 SELECT DISTINCT 查询之前合并 2 个或更多表?【英文标题】:MySQL, merging 2 or more tables before execute SELECT DISTINCT query? 【发布时间】:2010-03-23 09:20:31 【问题描述】:我想计算来自 2 个(或可能更多表)的唯一登录数。
我试过这个:
SELECT count(distinct(l1.user_id))
FROM `log_1` l1
LEFT JOIN `log_2` l2
ON l1.userid = l2.userid;
但它给了我 l1 的结果。如果我没有在 li.userid (distinct) 上加上 l1,它会说“模棱两可”。
如何合并表,然后选择合并表的唯一登录名?
编辑:
已测试:我测试了 count(distinct(l1.userid)) 和 count(distinct(l2.userid))。它给了我不同的结果
【问题讨论】:
你能定义一下你所说的“组合表格”是什么意思吗?您想要出现在任一表中的用户吗?出现在两个表中的用户?还有什么? @Mark Byers:我认为如果用户出现在两个表上会更准确吗?合并4张桌子真的需要很长时间,2分钟多,我现在还在等待。 (使用我上面的代码,将 LEFT JOIN 更改为 INNER JOIN) 【参考方案1】:如果您使用LEFT JOIN
,那么对于 l1 中的每一行,您将在组合结果中至少获得一行,因此如果您只想要一个不同的计数,则完全不需要连接。这将为您提供与查询相同的结果:
SELECT count(distinct(l1.user_id))
FROM `log_1` l1
也许您想要 INNER JOIN
或 UNION
代替?如果用户出现在任一表中,UNION
将对用户进行计数。 INNER JOIN
仅当它们出现在两个表中时才会计算它们。这是UNION
的示例:
SELECT count(*) FROM (
SELECT distinct(user_id) FROM `log_1`
UNION
SELECT distinct(user_id) FROM `log_2`
) T1
【讨论】:
以上是关于MySQL,在执行 SELECT DISTINCT 查询之前合并 2 个或更多表?的主要内容,如果未能解决你的问题,请参考以下文章