我有两张桌子:
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
答案 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
这种解决方案解决了这个问题......它是我实际编码的简化版本。我仍然感谢你的回答。