1

我正在尝试进行 SQL 查询,该查询显示类别以及该类别中有多少线程的计数。

这就是我得到的:

SELECT categories.category_name, categories.category_id, COUNT(*) 
AS 'threadCount' FROM threads 
    RIGHT OUTER JOIN categories 
    ON categories.category_id = threads.thread_category_id
GROUP BY categories.category_name, categories.category_id

它有点工作,但是 threadCount 的结果总是大于或等于 1,即使那里没有线程。

在此处输入图像描述

正如您在上图中所见,每个类别似乎都附有一个线程。但问题是,只有“类别 1”有线程,所有其他类别都有 0 个线程,所以它们应该显示 0 而不是 1。

4

2 回答 2

1

连接上的Outer包含所有类别,即使是未与任何线程连接的类别,这就是为什么您至少有 1 个。

SELECT categories.category_name, categories.category_id, COUNT(*) 
AS 'threadCount' FROM threads 
    RIGHT OUTER JOIN categories 
    ON categories.category_id = threads.thread_category_id
GROUP BY categories.category_name, categories.category_id

我会做到的,

SELECT categories.category_name, categories.category_id, 
    (SELECT COUNT(*) FROM threads WHERE 
      categories.category_id = threads.thread_category_id) AS 'threadCount' 
FROM categories 

我直接计算每个类别的线程,而不连接它们。

于 2013-03-08T08:22:51.843 回答
0

因为您正在执行右外连接,所以当您没有相应的线程时,null 也被计为 1。按以下方式运行您的查询以查看我的意思

SELECT categories.category_name, categories.category_id
AS 'threadCount' FROM threads 
    RIGHT OUTER JOIN categories 
    ON categories.category_id = threads.thread_category_id

或者您可以通过更改这样的查询来排除计为 1 的空值,

SELECT categories.category_name, categories.category_id, COUNT(threads.thread_category_id) 
AS 'threadCount' FROM threads 
    RIGHT OUTER JOIN categories 
    ON categories.category_id = threads.thread_category_id
GROUP BY categories.category_name, categories.category_id
于 2013-03-08T08:20:45.373 回答