MySQL - 计算行数和左连接问题

Posted

技术标签:

【中文标题】MySQL - 计算行数和左连接问题【英文标题】:MySQL - Counting rows and left join problem 【发布时间】:2011-01-12 06:21:23 【问题描述】:

我有 2 个表格、活动和活动代码:

广告系列:id、partner_id、状态

campaign_codes:id、代码、状态

我想获取所有活动的所有活动代码的计数,其中活动代码.状态等于 0 或活动没有活动代码记录。

我有以下 SQL,但 WHERE 语句当然会消除那些在活动代码中没有相应记录的活动(我也希望那些活动代码为零的活动)

SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count
FROM 
    campaigns c
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id
WHERE c.partner_id = 4
AND cc.status = 0
GROUP BY c.id

【问题讨论】:

【参考方案1】:

我会选择类似的东西:

SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count
FROM 
    campaigns c
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id
AND cc.status = 0 -- Having this clause in the WHERE, effectively makes this an INNER JOIN
WHERE c.partner_id = 4
GROUP BY c.id

AND 移动到连接子句使连接成功或失败,关键是将结果行保留在“右”表中没有匹配行的位置。

如果它在 WHERE 中,则与 NULL(没有campaign_code)的比较将失败,并从结果中消除。

【讨论】:

谢谢!那成功了。希望获得有关如何使用 AND 的解释或指向一些阅读的指针。 我要问的是是否有人可以解释或指向我在 WHERE 之前放置 AND 的资源。过去没有使用过,不确定我是否真的理解它。 @k00k 添加了更多关于“为什么”的细节 欣赏,非常感谢! :) 也不需要额外的 where 子句。您可以简单地进行内部连接并将“添加”条件添加到连接中。同样的效果,稍微更干净恕我直言:)【参考方案2】:
SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count
FROM 
    campaigns c
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id
    AND c.partner_id = 4
    AND cc.status = 0
GROUP BY c.id

【讨论】:

以上是关于MySQL - 计算行数和左连接问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的自然连接和左连接

具有三个未索引联合表和左连接的 MySQL 查询使数据库负担过重

左连接和左外连接有啥区别? [复制]

左外连接和左连接一样吗? [复制]

左外连接和左连接一样吗? [复制]

MySQL联合查询和左关联的区别