2013-02-09 60 views
2

我有一个SQL查询,我只需连接两个表。一个表格包含注释,另一个表格是用户表格。我加入表格,以简单的方式获取有关写评论(用户名)的用户的用户信息,同时获取评论(评论文本等)。SQL:加入计数不起作用

现在我想要计算注释的数量,以便在页面顶部写入正确数量的注释。我通过添加一个COUNT和一个别名来保存该值。

当我回显numCount时,我得到了正确的评论值,但我在评论循环中没有留言。只要我删除了伯爵,我就会再次收到所有评论。我究竟做错了什么?

SELECT 
ncID, ncText, ncDate, 
uID, uName, uImageThumb, 
COUNT(a.ncID) AS numComments 
FROM tblNewsComments a LEFT JOIN tblUsers b 
ON a.ncUserID = b.uID 
WHERE a.ncNewsID = $newID 
ORDER BY ncDate DESC 
+0

为了什么数据库? – 2013-02-09 01:49:50

回答

3

我打算假设这是MySQL(或者SQLite),因为大多数其他RDBMS在这个查询上会失败。问题在于您缺少GROUP BY子句,在使用像COUNT()这样的聚合函数时,除非要在整个行集上进行操作,否则这个子句是必需的。 MySQL的不寻常的行为是允许缺少GROUP BY,或允许SELECT中不在GROUP BY中的列产生异常结果。

执行此操作的适当方法是加入子查询,该子查询返回COUNT()ncID

SELECT 
    ncID, 
    ncText, 
    ncDate, 
    uID, 
    uName, 
    uImageThumb, 
    /* The count returned by the subquery */ 
    ccount.numComments 
FROM 
    tblNewsComments a 
    LEFT JOIN tblUsers b ON a.ncUserID = b.uID 
    /* Derived table returns only ncID and count of comments */ 
    LEFT JOIN (
    SELECT ncID, COUNT(*) AS numComments 
    FROM tblNewsComments 
    GROUP BY ncID 
) ccount ON a.ncID = ccount.ncID 
WHERE a.ncNewsID = $newID 
ORDER BY ncDate DESC 

编辑哎呦 - 看起来像你想的计数每ncID,不是每个ncUserID算作我本来它。

+0

SQLite将支持提供的查询 – 2013-02-09 01:50:08

+0

@OMGPonies的确如此。我没有意识到SQLite的行为也是如此。 (查询中的PHP变量仍然可能表示MySQL) – 2013-02-09 01:54:28

0

我不知道你正在使用什么SQL引擎,但你在这里有什么是不是有效的SQL,应该被标记为这样。

COUNT是一个聚合函数,你可以只适用于那些团体或整个表,所以你的情况,你可能会做

SELECT 
ncID, ncText, ncDate, 
uID, uName, uImageThumb, 
COUNT(a.ncID) AS numComments 
FROM tblNewsComments a LEFT JOIN tblUsers b 
ON a.ncUserID = b.uID 
WHERE a.ncNewsID = $newID 
GROUP BY ncID, ncText, ncDate, 
uID, uName, uImageThumb 
ORDER BY ncDate DESC 
+0

谢谢!我试过这个,但由于某种原因,它只给了我一个评论,当我尝试循环和计数时。任何想法可能是错的? – David 2013-02-09 01:51:29

+0

显然,我不知道你的表结构,但ncID可能不应该成为选择列表的一部分,也不应该是 - 尝试删除它。这似乎是评论ID,对吗? – 2013-02-09 01:54:35

+0

是的,这是评论ID(自动增量) – David 2013-02-09 01:55:12

0

您使用聚合函数(计数),但你”需要一个GROUP BY来从这个数字中获得任何意义。

我建议增加 “GROUP BY [除COUNT所有其他字段名]” 您查询

0

试试这个:

SELECT 
ncID, ncText, ncDate, 
uID, uName, uImageThumb, 
(SELECT COUNT(ncID) 
FROM 
tblNewsComments a 
INNER JOIN 
tblUsers b 
ON a.ncUserID = b.uID) 
AS numComments 
FROM tblNewsComments a LEFT JOIN tblUsers b 
ON a.ncUserID = b.uID 
WHERE a.ncNewsID = $newID 
ORDER BY ncDate DESC