MySQL Multiple INNER JOIN + GROUP BY 未按预期工作
Posted
技术标签:
【中文标题】MySQL Multiple INNER JOIN + GROUP BY 未按预期工作【英文标题】:MySQL Multiple INNER JOIN + GROUP BY not working as expected 【发布时间】:2020-01-08 05:40:08 【问题描述】:我正在根据一些字段值生成会员排行榜。使用下面的 SQL 我正在获取这些值...
SELECT ue1.user_id,
ue1.meta_value coins ,
ue3.meta_value user_rank ,
ue2.meta_value gems,
COUNT(ue4.user_id) quiz_count,
COUNT(ue5.user_id) video_watch_count,
ue1.meta_value + ue3.meta_value + ue2.meta_value total_points
FROM `wp_usermeta` as ue1
INNER JOIN `wp_usermeta` as ue2 ON ue2.user_id = ue1.user_id
AND ue1.meta_key = '_coin_points'
AND ue2.meta_key = '_gem_points'
INNER JOIN `wp_usermeta` as ue3 ON ue3.user_id = ue1.user_id
AND ue3.meta_key = '_user_rank'
INNER JOIN `wp_gamipress_user_earnings` as ue4 ON ue4.user_id = ue1.user_id
AND ue4.post_type = 'quiz-game-master'
INNER JOIN `wp_gamipress_user_earnings` as ue5 ON ue5.user_id = ue1.user_id
AND ue5.post_type = 'video-game-master'
WHERE ue1.meta_value > 0
AND ue2.meta_value > 0
GROUP BY ue1.user_id, ue1.meta_value, ue2.meta_value, ue3.meta_value, ue4.user_id, ue5.user_id
ORDER BY total_points DESC LIMIT 0, 50
我得到的是......不是预期的查询结果
看到了吗? video_watch_count 正在复制 quiz_count 值。我不知道为什么?如果您能在这里帮助我,将不胜感激。
【问题讨论】:
如果您从查询中删除 GROUP BY / COUNT(),您将了解会发生什么,因为 COUNT 也会计算连接数。您需要在子查询中进行 COUNT。 ...SELECT * FROM (SELECT COUNT()... )
AS 别名,当指望多对多或一对多关系时,这是最好的选择,但 COUNT(DISTINCT ...)
也应该工作..
您通常 GROUP BY 与您选择的列相同,但那些作为设置函数的参数的列除外。即尝试GROUP BY ue1.user_id, ue1.meta_value, ue2.meta_value, ue3.meta_value
。
【参考方案1】:
检查您的加入声明。对于quiz_count, video_watch_count,
,您从表wp_gamipress_user_earnings
中选择数据。对于每个条目,如果满足连接条件,它将从相应的表中返回user_id
。
最后你使用user_id
对它进行分组,这对两个连接结果都是通用的。这就是你得到相同计数的原因。
【讨论】:
我尝试使用不同的字段,如 post_id,但给出相同的复制值... 删除归档post_type
上的第二个连接条件。您应该像这样使用case
语句来实际计算quiz_count
和vidow_watch_count
。 COUNT(CASE WHEN ue4.post_type = 'quiz-game-master' THEN 1 END) AS quiz_count, COUNT(CASE WHEN ue5.post_type = 'video-game-master' THEN 1 END) AS video_watch_count
提供样本数据和您预期的结果并更新您的问题。给出一个完整的解决方案会很有用。
当我删除提交的 post_type 上的第二个连接条件并按照您的建议添加 COUNT(CASE WHEN ue4.post_type = 'quiz-game-master' THEN 1 END) AS quiz_count, COUNT(CASE WHEN ue5.post_type = 'video-game-master' THEN 1 END) AS video_watch_count
时,它会给出错误的值...以上是关于MySQL Multiple INNER JOIN + GROUP BY 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
mysql 里面JOIN 和 INNER JOIN 区别是啥
MySQL中inner join 和 cross join 的区别
MySQL left join right join inner join