【问题标题】:Displaying rows with count 0 in MySQL using COUNT and GROUP BY使用 COUNT 和 GROUP BY 在 MySQL 中显示计数为 0 的行
【发布时间】:2011-09-10 15:22:42
【问题描述】:

我有两个表,主题和内容,其中内容使用外键引用主题。我想显示每个主题在内容表中出现的次数(如果没有出现,则为 0)。但下面的查询只给了我计数 > 0 的行,而忽略了其他的:

SELECT Subject.id, Subject.name, COUNT(Content.subject_id) AS `count`
FROM Subject LEFT JOIN Content
ON Subject.id = Content.subject_id
WHERE type = @type
GROUP BY Subject.id;

我检查并尝试关注thisthisthis 的帖子,但由于某种原因,上面的代码不起作用。

有什么想法吗?

编辑: 类型字段在内容表中,这导致了“Will A”指出的问题

【问题讨论】:

    标签: mysql count outer-join


    【解决方案1】:

    type 的列在哪个表中?我假设它是 Content - 通过在 WHERE 子句中包含该字段,您将强制 LEFT JOIN 右侧的 Content 表中包含数据(这意味着 LEFT JOIN 实际上只是INNER JOIN)。

    试试:

    SELECT Subject.id, Subject.name, COUNT(Content.subject_id) AS `count`
    FROM Subject
    LEFT JOIN Content
    ON Subject.id = Content.subject_id
    AND type = @type
    GROUP BY Subject.id;
    

    【讨论】:

      【解决方案2】:

      type 列属于哪个表?如果typesubject 中,您的左连接应该可以工作。所以我假设typeContent 中。那么问题是您的 WHERE 子句与Content 中没有匹配行的情况不匹配。使用

      WHERE (type = @type) OR (type IS NULL)
      

      【讨论】:

        【解决方案3】:

        改为进行外连接。将空值替换为 0。将非空值替换为 1。而不是计数,对此列求和。

        希望对你有帮助

        【讨论】:

        • 不,COUNT(something) 会跳过 null 的东西。错误在 WHEREJOIN 中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        相关资源
        最近更新 更多