php - MySQL 查询多个 LEFT Joins 问题

标签 php mysql sql

我正在尝试从以下查询中获取所需的结果,但它似乎不起作用...

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/

相关文章:

mysql - 选择列值为 1 而不是 4 的人

javascript - DHTMLX DataProcessor 不保存对数据库的更改

mysql - DECLARE CONTINUE HANDLER FOR NOT FOUND SET 变量不起作用

mysql - SQL 问题 : one to many relationship and EAV model

c# - Windows Phone 8 中使用的数据库

php - 在 Laravel 的搜索表单中定义过滤器最小到最大价格的问题

php - 我的一些查询没有执行

javascript - 将 html anchor 标记值从 javascript 传递到 PHP

php - 如何在电子邮件中添加附件?

java - MySQL JDBC 插件加载