MySQL SELECT Count语句问题

时间:2014-05-24 10:36:27

标签: mysql sql

我有两个MySQL查询:

第一:

SELECT DISTINCT (broker.broker_id),company_id ,broker_name,company_name,mobile1_no,email,pan_card_num,broker_id,broker_id,company_id
FROM broker_firm AS broker_firm
LEFT JOIN broker ON broker_firm.company_id = broker.firm_id
AND broker_firm.is_active =1
AND broker.is_active =1

此查询生成331个结果。

第二

SELECT COUNT( broker.broker_id ) AS tot
FROM broker_firm AS broker_firm
LEFT JOIN broker AS broker ON broker_firm.company_id = broker.firm_id
AND broker_firm.is_active =1
AND broker.is_active =1

此查询生成289个结果。

任何人都可以告诉我原因吗?我预计两个结果都是一样的。或者,Count(*)结果可能更大。

提前致谢

3 个答案:

答案 0 :(得分:1)

当你执行left join时,逻辑很简单:保留第一个表中的所有行,无论on子句中的条件是否为真。如果条件为false,则第二个表中的所有列都将获得值NULL

执行inner join时,逻辑是将所有行保留在第一个表中。

在第一个查询中,附加条件位于on子句中。因此,保留了第一个表中的所有行(并且不要忘记连接本身可能导致重复)。在第二个查询中,where子句的条件为broker.is_active = 1is_activeNULL时,此条件将失败 - 这是记录不匹配时发生的情况。换句话说,条件是将left join变为inner join

编辑:

这个想法是一样的。第二个查询是计算匹配的记录。 count(broker.broker_id)计算该列的非NULL值。这与进行内部联接相同。

第一个查询是计算所有记录。 select distinct选择所有列的不同值。您的语法有点令人困惑,因为它表明您只需要一列的不同值。但这不是它的工作原理。因为select中的两个表都有列,所以不匹配的代理将在该行上显示其公司信息,使该行与所有其他行不同。

答案 1 :(得分:0)

第一个查询统计所有公司,你有42家没有经纪人的公司。 尝试

select count(broker_firm.company_id)
FROM broker_firm
where broker_firm.company_id not in (select firm_id from broker)

答案 2 :(得分:0)

为什么不在一个查询中同时使用它们?

 SELECT broker.broker_id,company_id ,broker_name,company_name,mobile1_no,email,pan_card_num,broker_id,broker_id,company_id,COUNT( broker.broker_id ) AS tot
 FROM broker_firm AS broker_firm
 LEFT JOIN broker ON broker_firm.company_id = broker.firm_id
 AND broker_firm.is_active =1
 AND broker.is_active =1
 GROUP BY broker.broker_id