【发布时间】:2014-04-02 19:41:22
【问题描述】:
我有两张桌子,
用户
userid fname usertype
1 Steve vendor
2 Peter vendor
3 John normaluser
4 Mark normaluser
5 Kevin vendor
6 Alan vendor
7 Sean vendor
供应商评级
id userid rating
1 1 4
2 2 3
3 2 2
4 2 4
5 1 3
6 5 2
7 5 2
userid 是外键。
我想通过降序/升序平均评级从用户表中显示所有供应商(仅用户类型供应商),即使供应商的评级在它应该显示的表上不可用,它的信息应该最后以降序显示,首先以升序显示。
我想从第一个表中获取所有用户信息,所以我使用左连接:
SELECT
users.name,
users.userid,
users.usertype
FROM users
LEFT JOIN (SELECT
ROUND(AVG(rating)) AS rating_avg,
userid
FROM vendor_rating
ORDER BY rating_avg DESC) ven
ON users.usertype = 'vendor'
AND users.userid = ven.userid
ORDER BY ven.rating_avg ASC;
请帮忙看看我哪里出错了。
编辑:
我明白了
userid ROUND(AVG(vr.ratings))
28 5
27 4
16 3
26 2
25 0
NULL NULL
NULL NULL
NULL NULL
NULL NULL
如果我使用
SELECT vr.userid, ROUND(AVG(vr.ratings)) FROM vendor_rating vr
RIGHT JOIN (SELECT users.fname, users.userid, users.usertype FROM users) u
ON u.id = vr.vendor_id WHERE u.usertype = 'vendor' GROUP BY vr.userid,u.fname
ORDER BY round(avg(vr.ratings)) ASC
我从 users 表中获取 NULL 值,这些值在 vendor_rating 表中不可用,这些值应该显示 userids
【问题讨论】:
-
你还没有真正定义什么不起作用。问题是您正在为用户 3 和 4 获得输出,但您不希望这样吗? (将
users.usertype='vendor'移动到 WHERE 子句中。) -
在您的问题中添加您想要的结果集
-
@MatBailie 我的查询返回所有用户,包括供应商和普通用户,甚至它没有按 asc/desc 结果的平均评级排序
-
@MKhalidJunaid 为有评分的人返回空平均评分
-
@MKhalidJunaid 这个 SELECT vr.userid, ROUND(AVG(vr.ratings)) FROM vendor_rating vr RIGHT JOIN (SELECT users.fname, users.userid, users.usertype FROM users) u ON u.id = vr.vendor_id WHERE u.usertype = 'vendor' GROUP BY vr.userid,u.fname ORDER BY round(avg(vr.ratings)) ASC 但此返回空值,其数据在 VENDOR_RATING 表中不可用