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_countvidow_watch_countCOUNT(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 inner join如何显示记录为空的数据

MySQL left join right join inner join

Mysql之inner join,left join,right join详解

Mysql 连接(left join, right join, inner join ,full join)