我有两个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(*)结果可能更大。
提前致谢
答案 0 :(得分:1)
当你执行left join
时,逻辑很简单:保留第一个表中的所有行,无论on
子句中的条件是否为真。如果条件为false,则第二个表中的所有列都将获得值NULL
。
执行inner join
时,逻辑是将所有行保留在第一个表中。
在第一个查询中,附加条件位于on
子句中。因此,保留了第一个表中的所有行(并且不要忘记连接本身可能导致重复)。在第二个查询中,where
子句的条件为broker.is_active = 1
。 is_active
为NULL
时,此条件将失败 - 这是记录不匹配时发生的情况。换句话说,条件是将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