【问题标题】:SQL find row value in other column of groups MAX() value - MySQLSQL在组MAX()值的其他列中查找行值 - MySQL
【发布时间】:2018-04-19 10:04:36
【问题描述】:

我有三个包含电影、评分和评论者数据的表格。我的数据的连接如下所示:

mysql root@localhost:foo> SELECT m.title, ra.stars, re.name
                       -> FROM Movie m
                       -> JOIN Rating ra ON m.mid = ra.mid
                       -> JOIN `Reviewer` re ON ra.rid = re.rid
                       -> ORDER BY m.title, ra.stars DESC;
+-------------------------+-------+------------------+
| title                   | stars | name             |
+-------------------------+-------+------------------+
| Avatar                  | 5     | James Cameron    |
| Avatar                  | 3     | Elizabeth Thomas |
| E.T.                    | 3     | Ashley White     |
| E.T.                    | 2     | Chris Jackson    |
| Gone with the Wind      | 4     | Sarah Martinez   |
| Gone with the Wind      | 3     | Mike Anderson    |
| Gone with the Wind      | 2     | Sarah Martinez   |
| Raiders of the Lost Ark | 4     | Brittany Harris  |
| Raiders of the Lost Ark | 4     | Chris Jackson    |
| Raiders of the Lost Ark | 2     | Brittany Harris  |
| Snow White              | 5     | Elizabeth Thomas |
| Snow White              | 4     | Daniel Lewis     |
| The Sound of Music      | 3     | Chris Jackson    |
| The Sound of Music      | 2     | Brittany Harris  |
+-------------------------+-------+------------------+

我想要实现的是按标题对上面的表格进行分组,并获得给每部电影最高评分的评论者的姓名。结果应如下所示。

+-------------------------+-------+------------------+
| title                   | stars | name             |
+-------------------------+-------+------------------+
| Avatar                  | 5     | James Cameron    |
| E.T.                    | 3     | Ashley White     |
| Gone with the Wind      | 4     | Sarah Martinez   |
| Raiders of the Lost Ark | 4     | Brittany Harris  |
| Raiders of the Lost Ark | 4     | Chris Jackson    |
| Snow White              | 5     | Elizabeth Thomas |
| The Sound of Music      | 3     | Chris Jackson    |
+-------------------------+-------+------------------+

我不知如何做到这一点。谁能指出我正确的方向?

编辑:我最初虽然在星列 (MAX(stars)) 上包含另一个聚合函数是微不足道的,但我无法让它工作。任何想法如何工作?

【问题讨论】:

  • 试试我的答案。希望对你有帮助。

标签: mysql sql group-by max


【解决方案1】:

解决方案 1: - 来自您的结果集:

SELECT A.* 
FROM Your_Table A
JOIN(
    SELECT title,MAX(stars) stars
    FROM Your_Table
    GROUP BY title
    )B ON A.title = B.title AND A.stars = B.stars

第二个解决方案: - 从你的桌子

SELECT m.title, ra.stars, re.name
FROM Movie m
JOIN(
    SELECT R.* 
    FROM Rating R
    JOIN(
        SELECT mid
            ,MAX(stars) Stars
        FROM Rating
        GROUP BY mid
        )D ON R.mid = D.mid AND R.Stars = D.Stars
    )Ra ON m.mid = ra.mid
JOIN Reviewer re ON ra.rid = re.rid

【讨论】:

  • 感谢您的快速回复!
  • 我尝试将每个组的 SUM(stars) 添加到结果中,但无法解决。你能再给我一个提示吗?
【解决方案2】:
 SELECT m.title, ra.stars, re.name
       FROM Movie m
      JOIN Rating ra ON m.mid = ra.mid
      JOIN Reviewer re ON ra.rid = re.rid
      JOIN 
 (SELECT m.title, max(ra.stars) as stars
       FROM Movie m
      JOIN Rating ra ON m.mid = ra.mid
      GROUP BY m.title) c
ON c.title=m.title AND ra.stars=c.stars
      ORDER BY m.title, ra.stars DESC

【讨论】:

  • 谢谢你!
【解决方案3】:

以下代码将对您有所帮助,

SELECT m.title, ra.stars, re.name
FROM Movie m
JOIN Rating ra ON m.mid = ra.mid
JOIN Reviewer re ON ra.rid = re.rid
WHERE ra.stars = ( SELECT MAX(ra1.stars) FROM Movie m1 JOIN Rating ra1 on m1.mid = ra1.mid WHERE m1.title = m.title) 
ORDER BY m.title, ra.stars DESC;

【讨论】:

  • 非常感谢您的快速回复!
【解决方案4】:
SELECT m.title, ra.stars, re.name
FROM Movie m
JOIN (SELECT mid,MAX(stars) AS stars FROM Rating GROUP BY mid) ra 
ON m.mid = ra.mid
JOIN Rating ra1
ON ra1.mid = ra.mid AND ra1.star=ra.star
JOIN Reviewer re 
ON ra1.rid = re.rid
ORDER BY m.title, ra.stars DESC;

【讨论】:

  • 你有一个小错误,它应该在第 6 行显示为ra1.stars = ra.stars
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
相关资源
最近更新 更多