mysql - MySQL在排名中包含所有结果
问题描述
我正在使用以下查询进行排序,Order by
用于 4 个不同的排名:id、avg_rating、total_sent & points
但是,我无法将所有成员都包含在结果中。我想包括所有成员,包括那些有 0 的成员:total_sent、total_received、points、avg_rating、votes
请帮助我了解我所缺少的。谢谢你。
SELECT m.id,
m.Name,
m.City,
m.Zip_Code,
m.url,
r.avg_rating,
r.votes,
froms.from_ct total_sent,
tos.to_ct total_received,
froms.from_ct - tos.to_ct `points`
FROM members m
JOIN (
SELECT id_rated,
avg(rating) avg_rating,
count(*) votes
FROM member_ratings
GROUP BY id_rated
) r ON r.id_rated = m.id
JOIN ( SELECT id_from, COUNT(*) AS from_ct FROM member_points GROUP BY 1
) AS froms ON froms.id_from = m.id
JOIN ( SELECT id_received, COUNT(*) AS to_ct FROM member_points GROUP BY 1
) AS tos ON tos.id_received = m.id
WHERE m.Account_Active = 'TRUE'
GROUP BY m.id,
m.Name
ORDER BY `avg_rating` DESC;
解决方案
对所有表使用 LEFT JOIN
SELECT m.id,
m.Name,
m.City,
m.Zip_Code,
m.url,
r.avg_rating,
r.votes,
froms.from_ct total_sent,
tos.to_ct total_received,
froms.from_ct - tos.to_ct `points`
FROM members m
LEFT JOIN (
SELECT id_rated,
avg(rating) avg_rating,
count(*) votes
FROM member_ratings
GROUP BY id_rated
) r ON r.id_rated = m.id
LEFT JOIN ( SELECT id_from, COUNT(*) AS from_ct FROM member_points GROUP BY 1
) AS froms ON froms.id_from = m.id
LEFT JOIN ( SELECT id_received, COUNT(*) AS to_ct FROM member_points GROUP BY 1
) AS tos ON tos.id_received = m.id
LEFT JOIN member_points mp ON mp.id_points = m.id
WHERE m.Account_Active = 'TRUE'
GROUP BY m.id,
m.Name
ORDER BY `avg_rating` DESC;
推荐阅读
- sql - 查找列相同但排除另一列等于 X 的行
- c++ - 是否将正确对齐和大小的数组转换为未构造的 Trivial Type 未定义行为?
- arrays - 查找列总和至少达到目标的最小行集
- reactjs - react: 使用 useReducer 和功能组件将 api 结果放入表中
- javascript - 编辑特定选项卡时将 google 表格复制并粘贴到另一个 google 表格
- c - 赋值后引用非NULL值NULL
- javascript - javascript:为什么代理不拦截方法
- python - 如何访问数据框列单元格中的第一个和最后一个字母?
- css - 桌面视图的放大徽标,但现在移动视图上的徽标周围有额外的填充
- saxon - 使用 xpath 3.1 fn:transform 创建 xsl:result-document 使用 saxon 9.9 EE