2

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

4 回答 4

3

我将假设这是 MySQL(或者可能是 SQLite),因为大多数其他 RDBMS 将在此查询上失败。问题是您缺少一个GROUP BY子句,这是使用聚合函数时所必需的,COUNT()除非它要对整个行集进行操作。MySQL 的异常行为是允许不存在 a GROUP BY,或者允许不在 中的列SELECT产生GROUP BY异常结果。

执行此操作的适当方法是加入返回COUNT()per的子查询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

编辑哎呀 - 看起来你想要 count per ncID,而不是ncUserID我最初拥有的 count per 。

于 2013-02-09T01:39:48.030 回答
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  
于 2013-02-09T02:18:16.023 回答
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
于 2013-02-09T01:40:56.433 回答
0

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

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

于 2013-02-09T01:41:10.753 回答