【问题标题】:Query COUNT(field) doesnt take id in consideration [duplicate]查询 COUNT(field) 不考虑 id [重复]
【发布时间】:2021-02-22 20:22:18
【问题描述】:

我有以下疑问:

         SELECT     dtr_user.username, 
                    dtr_user.loggedin, 
                    dtr_user.profilepicture, 
                    dtr_siterank.siterankname, 
                    dtr_user.joindate, 
                    COUNT(forum_post.postid), 
                    COUNT(dtr_entries.entreeid) 
            FROM    dtr_user, 
                    forum_post, 
                    dtr_entries, 
                    dtr_siterank 
            WHERE dtr_user.userid = ? 
            AND dtr_user.userid = dtr_entries.entreeauthor
            AND dtr_user.userid = forum_post.userid
            AND dtr_user.siterank = dtr_siterank.siterankid

所以我希望它返回海报的 postid.s 计数,与主菜 id 的计数相同

当我运行SELECT COUNT(forum_post.postid) FROM forum_post where forum_post.userid = 1 时,它返回正确的数字(17),与返回4SELECT COUNT(dtr_entries.entreeid) FROM dtr_entries where dtr_entries.entreeauthor = 1 相同

然而,在主查询中,这两个数字都出现了68。我是否对此应用左连接?查询真的不是我的弦乐。

【问题讨论】:

标签: mysql sql count inner-join aggregate-functions


【解决方案1】:

我想你想要:

SELECT  u.*, s.siterankname, 
    (SELECT COUNT(*) FROM forum_post fp WHERE fp.user_id = u.userid) cnt_forum_post,
    (SELECT COUNT(*) FROM dtr_entries e WHERE e.entreeauthor = u.user_id) cnt_dtr_entries
FROM dtr_user u
INNER JOIN dtr_siterank s ON s.siterankid = u.siterank
WHERE u.userid = ? 

理由:

  • 您的原始代码不是有效的聚合查询;你需要一个GROUP BY 子句,它应该与SELECT 子句一致

  • 但即便如此,如果forum_postdtr_entries 表中的每个用户都有多个匹配项,则结果将是错误的;为了避免这种情况,我使用关联子查询来计算两个表中每个表中匹配条目的数量(这避免了外部聚合的需要)

  • 我假设dtr_siterank 中只有一个匹配项,并使用常规连接将列siterankname 引入

注意事项:

  • 不要使用隐式连接!几十年前,当显式连接(使用 JOIN ... ON 关键字)成为标准时,这种旧语法(在 FROM 子句中使用逗号)已经失宠

  • 表别名使查询更易于编写和阅读

【讨论】:

  • 感谢您的解释。是的。您是对的,siterank 中只能有一个结果。谢谢指点!我一定会使用它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
相关资源
最近更新 更多