在mysql中选择Count语句

时间:2013-11-21 13:42:08

标签: mysql sql

我有查询,想要计算每个帖子中的帖子数量。现在我遇到了一些问题。如果我的新帖子没有帖子ID就不会显示该帖子。我可以知道如何修复它? 这是我的查询

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           |
 ------------------------------------------------

回复基于对帖子的回复。

3 个答案:

答案 0 :(得分: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的结果集中。

答案 1 :(得分: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

请注意第二个查询中的细微更改。我已将一个连接更改为LEFT连接。它将在联接中的第一个(左)表中{em>所有记录thread,并在可能的情况下匹配post

答案 2 :(得分: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