【问题标题】:MySQL - Counting rows and left join problemMySQL - 计算行数和左连接问题
【发布时间】: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

【问题讨论】:

    标签: mysql join count group-by


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2013-01-31
      相关资源
      最近更新 更多