【问题标题】:2 Outer Joins from one table一张表的 2 个外部联接
【发布时间】:2017-05-18 22:20:32
【问题描述】:

我想了解 Web 开发,所以我创建了一个网站,用户可以在其中对电影进行投票,但在查询我需要的内容时遇到了问题。我的表格如下:

--rtable--
+-----------+------------+------------+
| movieid   | rating     | userid     |
+-----------+------------+------------+
| 1         | 9          | 27         |
| 2         | 8          | 27         |
| 1         | 10         | 31         |
| 1         | 7          | 42         |
| 2         | 8          | 31         |
+-----------+------------+------------+
--mtable--
+-----------+------------+------------+------------+
| movieid   | moviename  | movielink  | director   |
+-----------+------------+------------+------------+
| 1         | Foo        | foo.com    | bob        |
| 2         | Bar        | bar.com    | steve      |
+-----------+------------+------------+------------+

我想查询电影名称、电影链接、avg(rating) 和用户评分(如果存在),按 avg(rating) 降序

--desiredtable (if userid == 42)--
+-----------+------------+------------+------------+
| moviename |  movielink | avgrating  | yourrating |
+-----------+------------+------------+------------+
| Foo       | foo.com    | 8.66       | 7          |
| Bar       | bar.com    | 8          | NULL       |
+-----------+------------+------------+------------+

我已经设法让电影名称 + 电影链接 + avgrating 与 OUTER LEFT JOIN 一起工作,但我对如何添加您的评级感到头疼。我尝试在 OUTER JOIN 上加倍并使用子查询,但似乎无法正常工作。

这就是我目前所拥有的效果

SELECT mtable.moviename, mtable.movielink, ROUND(AVG(rtable.rating), 2) AS avgrating, 
FROM mtable LEFT OUTER JOIN rtable ON rtable.movieid = mtable.movieid GROUP BY mtable.charid ORDER BY AVG(rtable.rating) DESC

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    你需要在mtable上加入rtable两次,一次获取所有评分的平均值,一次获取用户的评分。您还需要提供在 on 子句中过滤 r2 的用户 ID。 on 子句中的过滤条件仅适用于 r2,而不适用于整个数据集。

    SELECT mtable.moviename, mtable.movielink, ROUND(AVG(r1.rating), 2) AS avgrating, max(r2.rating) as yourrating
    FROM mtable m LEFT OUTER JOIN rtable r1 ON r1.movieid = m.movieid
    LEFT JOIN rtable r2 on  r2.movieid=m.movieid and r2.userid=...
    GROUP BY m.movieid, m.moviename, m.movielink
    ORDER BY AVG(r1.rating) DESC
    

    【讨论】:

    • 非常感谢!真的帮助了我。
    猜你喜欢
    • 2013-06-11
    • 2016-06-15
    • 2013-07-06
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多