【发布时间】: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