选择用户'信息及其评论总数

时间:2015-07-11 09:45:31

标签: sql sql-server

我有两张桌子:

User    : (id, username, created_at, updated_at)

Comment : (comment_id, user_id, username, created_at, updated_at)

注意:是的,我确实理解评论表有一个重复的字段,'用户名'。但是,该表已经以这种方式设计,我无权重新设计架构。

这是我想要从表中提取数据的输出格式。

id | username | num_of_counts

这是我尝试过的两个不同的sql代码(我已经简化了代码以向您展示我尝试做的事情......可能存在轻微的错别字,但一般的想法在这里。)

-- Ver 1
SELECT u.id, u.username, COUNT(c.id)
FROM User u
LEFT JOIN Comment c ON u.id = c.id
GROUP BY u.id

-- Ver 2
SELECT u.id, u.username, c.cnt
FROM User u
LEFT JOIN (SELECT id, COUNT(*) AS cnt
           FROM Comment
           GROUP BY user_id) c
       ON u.id = c.id
GROUP BY u.id

这两个代码都给了我同样的问题:

  

"列'用户名'在选择列表中无效,因为它不是   包含在聚合函数或GROUP BY子句中#34;

在阅读some articles之后,我了解到在选择用户名'之间存在冲突。并按' id'

对行进行分组

我仍在谷歌搜索和阅读similar cases,但仍然遇到同样的问题(我对sql的东西并不擅长......)

以这种格式编写SQL查询以获取输出的最佳方法是什么?

id | username | num_of_comments    
1  |    Tyler |      3    
2  |    Jane  |      5    
3  |    Jack  |      1

3 个答案:

答案 0 :(得分:3)

SELECT u.id, u.username, COUNT(c.id) as theCount
FROM User u
JOIN Comment c ON u.id = c.id
GROUP BY u.id,u.username

答案 1 :(得分:2)

德鲁有正确的答案。但我想指出你的第二个查询也可以。它只是在最外层不需要group by

SELECT u.id, u.username, c.cnt
FROM User u LEFT JOIN
     (SELECT id, COUNT(*) AS cnt
      FROM Comment
      GROUP BY user_id
     ) c
     ON u.id = c.id;

在某些情况下,这甚至可以有更好的性能 - 例如,如果username是一个非常非常长的字符串。

答案 2 :(得分:0)

两者都没有解决问题......:'(

SELECT
*,
(SELECT COUNT(id) FROM Comment WHERE id = id) AS Comments
FROM User
ORDER BY id DESC

这种解决方案解决了这个问题......它是我实际编码的简化版本。我仍然感谢你的回答。