查询 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_post
和 dtr_entries
table 中每个用户都有多个匹配项,结果将是错误的;为了避免这种情况,我曾经关联子查询来计算两个 table 中每个匹配条目的数量(这避免了外部聚合的需要)
我假设 dtr_siterank
中只有一个匹配项,并使用常规连接将列 siterankname
备注:
不要使用隐式连接!几十年前,当显式连接(使用 JOIN ... ON
关键字)成为标准时,这种旧语法(在 FROM
子句中使用逗号)就不再受欢迎了
table 别名使查询更易于编写和阅读
我有以下查询:
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_post
和dtr_entries
table 中每个用户都有多个匹配项,结果将是错误的;为了避免这种情况,我曾经关联子查询来计算两个 table 中每个匹配条目的数量(这避免了外部聚合的需要)我假设
dtr_siterank
中只有一个匹配项,并使用常规连接将列siterankname
备注:
不要使用隐式连接!几十年前,当显式连接(使用
JOIN ... ON
关键字)成为标准时,这种旧语法(在FROM
子句中使用逗号)就不再受欢迎了table 别名使查询更易于编写和阅读