我有一个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 :(得分: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