如何获取sql中的记录计数

时间:2014-11-23 18:57:57

标签: sql

我的数据库中有两个表,一个是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

4 个答案:

答案 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

Read Here