Mysql 查询计数(字段)不考虑id
我有以下疑问:Mysql 查询计数(字段)不考虑id,mysql,sql,count,inner-join,aggregate-functions,Mysql,Sql,Count,Inner Join,Aggregate Functions,我有以下疑问: SELECT dtr_user.username, dtr_user.loggedin, dtr_user.profilepicture, dtr_siterank.siterankname, dtr_user.joindate, COUNT(fo
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
所以我希望它能为我返回海报的posted.s的数量,和主菜id的数量一样
当我从forum_post运行SELECT COUNT(forum_post.postid)时,其中forum_post.userid=1
返回正确的数字(17),与从dtr_entries.Entreautor=1的dtr_条目运行SELECT COUNT(dtr_entries.EntreId)相同,后者返回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 = ?
理由:
- 您的原始代码不是有效的聚合查询;您需要一个
groupby
子句,该子句应与SELECT
子句一致
- 但即便如此,如果在
forum\u post
和dtr\u条目
表中,每个用户都有几个匹配项,那么结果将是错误的;为了避免这种情况,我使用关联子查询来计算两个表中每个表中匹配项的数量(这避免了外部聚合的需要)
- 我假设在
dtr\u siterank
中只有一个匹配项,并使用常规联接将列siterankame
注:
- 不要使用隐式连接!几十年前,当显式连接(使用
JOIN…ON
关键字)成为标准时,这种旧语法(在FROM
子句中使用逗号)就不受欢迎了
- 表别名使查询更易于编写和读取
请阅读并做一个统计,因为每个帖子的连接返回4行,所以要乘以计数。也许您的意思是要进行count(DISTINCT…
?COUNT()不带distinct只计算参数不为null的次数,这就是为什么两个ID相等的原因。感谢您的解释。是的。您是正确的,siterank中只能有一个结果。谢谢你的指点!我一定会用的