【问题标题】:MySQL Multiple INNER JOIN + GROUP BY not working as expectedMySQL Multiple INNER JOIN + GROUP BY 未按预期工作
【发布时间】: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

标签: mysql sql wordpress phpmyadmin


【解决方案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 时,它会给出错误的值...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2021-04-25
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多