我的数据库中有两个表,一个是tblNews,另一个是tblNewsComments 我想从tblNewsComments中选择10条记录而不是必须评论新闻 我使用了这个查询,但它给出了一个错误
SELECT tblNews.id,
tblNews.newsTitle,
tblNews.createdate,
tblNews.viewcount,
COUNT(tblNewsComments.id) AS comcounts
FROM tblNews
INNER JOIN tblNewsComments ON tblNews.id = tblNewsComments.newsID
GROUP BY tblNews.id
答案 0 :(得分:2)
尝试替换
GROUP BY tblNews.id
使用
GROUP BY tblNews.id,
tblNews.newsTitle,
tblNews.createdate,
tblNews.viewcount
SELECT列表中的所有表达式都应该在GROUP BY中或在聚合函数内。
答案 1 :(得分:2)
我一直认为这是SQL中的烦恼。您的查询没有任何逻辑错误;您按新闻项目分组并选择新闻项目的各种属性,然后选择链接到新闻项目的评论计数。这是有道理的。
错误的产生是因为SQL引擎不够聪明,无法意识到tblNews中的所有列都在同一个数据上下文中,并且tblNews.id的分组有效地保证了只有一个newsTitle,createdate和每个组的viewcount。 应能够实现,我认为,并执行查询。但它没有那样做;它认为在组数据上下文中唯一唯一的列是您按ID分组的确切列。
正如Multisync刚发布的那样,一个解决方案是按要包含在select子句中的所有列进行分组。但是,我认为这不是最好的解决方案,因为您不必在group by子句中指定所有这些列,这会强制您在添加新的TblNews列时继续添加到该列表选择条款。
我一直使用的解决方案是将列包装在select子句中的无效聚合函数中;我总是使用max()
:
select
tblNews.id,
max(tblNews.newsTitle),
max(tblNews.createdate),
max(tblNews.viewcount),
count(tblNewsComments.id) comcounts
from
tblNews
inner join tblNewsComments on tblNews.id=tblNewsComments.newsID
group by
tblNews.id
;
答案 2 :(得分:2)
或者使用子查询:
SELECT n.id,
n.newsTitle,
n.createdate,
n.viewcount,
(SELECT COUNT(*) FROM tblNewsComments c ON n.id = c.newsID) AS comcounts
FROM tblNews n
答案 3 :(得分:0)
您必须选择一列并按另一列分组...其他列将无效,因为它们不在聚合函数中。
SELECT tblNews.id, COUNT(tblNewsComments.newsID) AS comcounts
FROM tblNews
INNER JOIN tblNewsComments ON tblNews.id = tblNewsComments.newsID
GROUP BY tblNews.id