【问题标题】:Calculate round(avg) from same table and join从同一张表计算round(avg)并加入
【发布时间】: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 表中不可用

标签: mysql sql


【解决方案1】:

试试这个

SELECT
  vr.userid,
  u.fname,
  ROUND(AVG(vr.rating))
FROM vendor_rating vr
  INNER JOIN users u
    ON u.userid = vr.userid
WHERE u.usertype = 'vendor'
GROUP BY vr.userid,
         u.fname
ORDER BY round(avg(vr.rating)) ASC

【讨论】:

  • 如何按平均评分的升序/降序对其进行排序
  • 你可以尝试按查询的轮次(avg(vr.rating))ASC或DESC结束排序
  • 感谢分享答案,但我还想展示用户表中的所有供应商,这些供应商的数据在 vendor_rating 中不可用
  • 你可以在 group by 之后使用 "have round(avg(vr.rating)) = 0"
  • 它只返回一个评分为零的结果,我认为需要左连接从用户表中选择用户类型为供应商的所有结果
【解决方案2】:

终于明白了

SELECT users.fname, users.userid,users.usertype
FROM users  
LEFT JOIN (select ROUND(AVG (ratings)) AS rating_avg,userid FROM 
vendor_rating group by userid order by rating_avg desc ) ven 
ON users.id=userid 
WHERE users.usertype='vendor'
order by rating_avg desc

感谢大家分享观点以解决我的问题。

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多