根据其中一个表中特定列中的最高值返回JOIN结果

时间:2013-12-19 18:50:24

标签: mysql sql join sql-order-by

我有两张桌子。一个叫movies,另一个叫movies_downloads。以下是表格的示例:

movies

╔═══╦════════════╗
║   ║ name       ║
╠═══╬════════════╣
║ 1 ║ Movie1     ║
║ 2 ║ Movie2     ║
║ 3 ║ Movie3     ║
╚═══╩════════════╝

movies_downloads

╔═════════╦════════════╗
║ movieId ║   id (ai)  ║
╠═════════╬════════════╣
║   1     ║     1      ║
║   1     ║     2      ║
║   2     ║     3      ║
║   3     ║     4      ║
╚═════════╩════════════╝

您可以看到,它可能是同一部电影的movies_downloads中的两行。 (在这种情况下,它是电影#1)

我想选择从结尾到开头的所有电影,我想加入下载表,并从中获取最后一行(最大ID)。

在这种情况下,结果将是:

MovieId     Name     movies_downloads.id
   3       Movie3       4      
   2       Movie2       3      
   1       Movie1       2

问题在于:它不是给我id#2(因为他是最后一个),而是给出了id#1。 (这是第一个)

我的代码:

SELECT      `movies`.*, `movies_downloads`.`id`
FROM        `movies`
JOIN        `movies_downloads`
ON          `movies`.`id` =  `movies_downloads`.`movieId` 
GROUP BY    `movies`.`id` 
ORDER BY    `movies_downloads`.`id`
DESC 
LIMIT 10
BTW,我使用mysql引擎,如果重要的话。

谢谢!

1 个答案:

答案 0 :(得分:1)

为了能够显示最新的下载,您需要向movie_downloads添加一个可以确定插入顺序的附加列。这通常是自动增量Id列或时间戳列。我将假设您要更改架构,为Id添加movie_downloads列。然后,您可以使用它来使用以下查询显示所需的数据

为了返回在特定列中提供最高值的连接行,您需要使用this answer中给出的相同问题之一。这是使用第一种技术进行的演示。

SELECT      m.Id, m.Name, d.Link
FROM        movies as m
JOIN        movies_downloads as d ON m.id = d.movieId 
JOIN   (SELECT MovieId, max(Id) as maxId from movies_downloads GROUP BY MovieId) as d2
            ON d.movieId = d2.movieId AND d.Id = d2.MaxId
ORDER BY    m.id desc
LIMIT 10

这里的第二个连接是密钥 - 它位于同一个movies_downloads表中,并为该表中的每个movieId提供max(id)。这连接到movies_downloads表的第一个连接,以将从那里包含的行限制为只有一个 - 您想要的行(具有最高id值)。