2013-11-21 197 views
1

我有一个查询,它可以计算每个线程中的帖子数。现在我遇到了一些问题。如果我的新线程没有帖子ID,它不会显示线程。我可以知道我该如何解决它? 这里是我的查询mysql语句中的count语句select

SELECT t.title, m.userName, COUNT(p.postID) AS Expr1, t.threadID 
FROM post p ,thread t , person m WHERE m.PersonID = t.PersonID 
AND t.threadID = p.threadID AND t.categories = "Announcement" 
GROUP BY t.title, m.PersonName 

我希望我会得到的结果类似

------------------------------------------------- 
| Title   | Author |   Replies| 
------------------------------------------------- 
| Hello   | haah |  7   | 
------------------------------------------------ 
| Bye Bye  | lee  |  8   | 
------------------------------------------------ 

的答复是基于线程的答复。

+0

尝试使用'LEFT JOIN'来做这件事 –

回答

1

使用LEFT JOIN代替,像这样:

SELECT 
    t.title, m.userName, t.threadID, 
    COUNT(COALESCE(p.postID, 0)) AS Expr1 
FROM 
(
    SELECT * 
    FROM thread 
    WHERE categories = 'Announcement' 
) AS t 
LEFT JOIN post p ON t.threadID = p.threadID 
LEFT JOIN person m ON m.PersonID = t.PersonID 
GROUP BY t.title, m.PersonName, t.threadID ; 

那么如果一个线程没有任何职位,将包括在结果与COUNT = 0

+0

它显示出数据库中的所有内容...不仅仅基于公告 – user2769165

+0

@ user2769165 - 将它移到where子句,请参阅我的编辑。 –

+0

已经正确显示,但现在计数不准确。没有帖子显示的线程1.但它应该显示0 – user2769165

0
SELECT t.title, m.userName, COUNT(p.postID) AS Expr1, t.threadID 
FROM post p left join thread t on t.threadID = p.threadID 
left join person m on m.PersonID = t.PersonID 
Where t.categories = "Announcement" 
GROUP BY t.title, m.PersonName 
1

设置第一步是用JOIN语法重写你的查询(你需要需要来学习这个)

SELECT t.title 
    , m.userName 
    , COUNT(p.postID) As Expr1 
    , t.threadID 
FROM thread As t 
INNER 
    JOIN post As p 
    ON p.threadID = t.threadID 
INNER 
    JOIN person As m 
    ON m.PersonID = t.PersonID 
WHERE t.categories = "Announcement" 
GROUP 
    BY t.title 
    , m.PersonName 

这使用INNER加入。此连接类型表示每条记录必须在连接的任一侧都有匹配。

为了得到你想要的结果,你需要一个OUTER连接。这将返回连接一侧的所有记录,并在可能的情况下匹配外部表中的记录。

SELECT t.title 
    , m.userName 
    , COUNT(p.postID) As Expr1 
    , t.threadID 
FROM thread As t 
LEFT 
    JOIN post As p 
    ON p.threadID = t.threadID 
INNER 
    JOIN person As m 
    ON m.PersonID = t.PersonID 
WHERE t.categories = "Announcement" 
GROUP 
    BY t.title 
    , m.PersonName 

请注意第二个查询中非常微妙的变化。我已将一个连接更改为左连接。在连接中的第一个(左)表中,将需要所有记录,并且在可能的情况下匹配post

+0

谢谢..它的工作:D – user2769165

+0

@ user2769165你明白它为什么有效吗? – gvee