SQL:计数加入不起作用

时间:2013-02-09 01:36:29

标签: sql join aggregate-functions

我有一个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

4 个答案:

答案 0 :(得分: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点数。

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

答案 2 :(得分:0)

您正在使用AGGREGATE函数(Count),但您需要GROUP BY才能从该计数中获得任何意义。

我建议在查询中添加“GROUP BY [除COUNT以外的所有其他字段名称]”

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