我正在尝试从以下查询中获取所需的结果,但它似乎不起作用...
SELECT DISTINCT
u.user_name as user_name,
u.total_points as total_points,
u.user_id as user_id,
COUNT(a.id) as user_total_articles_published,
COUNT(r.id) as user_total_replies_published,
COUNT(v.id) as user_total_votes_done
FROM users as u
LEFT JOIN articles as a ON u.user_id=a.user_id
LEFT JOIN replies as r ON u.user_id=r.user_id
LEFT JOIN votes as v ON u.user_id=v.user_id
GROUP BY u.user_id
ORDER BY u.total_points DESC
LIMIT 10
如果我删除最后 2 个 LEFT joINS,查询将正常工作...其他 2 个有什么问题?我必须使用其他方法才能使它起作用吗?
谢谢
最佳答案
我认为“不工作”是指查询返回了太多记录?那是因为连接的组合。您返回每条文章记录的每个回复,因此数字相乘。您可以通过在 COUNT 中使用 DISTINCT
来解决这个问题。这样,您计算唯一 ID,因此每篇文章只计算一次:
COUNT(distinct a.id) as user_total_articles_published,
COUNT(distinct r.id) as user_total_replies_published,
COUNT(distinct v.id) as user_total_votes_done
[编辑]
一个可能更快的解决方案,消除了对 DISTINCT 和 GROUP BY 的需要:
SELECT
u.user_name as user_name,
u.total_points as total_points,
u.user_id as user_id,
(SELECT COUNT(a.id) FROM articles a
WHERE a.user_id = u.user_id) as user_total_articles_published,
(SELECT COUNT(r.id) FROM replies r
WHERE r.user_id = u.user_id) as user_total_replies_published,
(SELECT COUNT(v.id) FROM votes v
WHERE v.user_id = u.user_id) as user_total_votes_done
FROM users as u
ORDER BY u.total_points DESC
LIMIT 10
关于php - MySQL 查询多个 LEFT Joins 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432757/