我有两张 table 。一个名为 movies
,另一个名为 movies_downloads
。这是表格的示例:
电影
:
╔═══╦════════════╗
║ ║ 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
顺便说一句,如果重要的话,我使用 mysql 引擎。
谢谢!
最佳答案
为了能够显示最近的下载,您需要向 movie_downloads
添加一个可以确定插入顺序的附加列。这通常是自动递增的 Id
列或时间戳列。我假设您要更改模式以添加 movie_downloads
的 Id
列。然后,您可以使用它通过以下查询显示所需的数据
为了返回在特定列中给出最高值的连接行,您将需要使用 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
值)。
关于mysql - 根据其中一个表中特定列中的最大值返回 JOIN 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20689435/