查询 COUNT(field) 不考虑 id

Query COUNT(field) doesnt take id in consideration

我有以下查询:

         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

所以我希望我 return 海报的 postid.s 计数,以及主菜 ID 的计数

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

然而在主查询中,它在两个数字上都出现了 68。我是否对此应用左连接?查询真的不是我的字符串套装。

我想你想要:

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 table 中每个用户都有多个匹配项,结果将是错误的;为了避免这种情况,我曾经关联子查询来计算两个 table 中每个匹配条目的数量(这避免了外部聚合的需要)

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

备注:

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

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