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 JOINUNION 代替?如果用户出现在任一表中,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 个或更多表?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中select distinct的使用方法

2.MySQL的select distinct语句

(转载)MySQL select 语句执行顺序

如何在 python 代码中添加 mysql 查询 select distinct?

MySQL SELECT执行顺序

MYSQL 查询慢 SELECT DISTINCT