【问题标题】:Return JOIN results based on the highest value in a specific column in one of the tables根据其中一个表中特定列中的最大值返回 JOIN 结果
【发布时间】:2013-12-19 18:50:23
【问题描述】:

我有两张桌子。一个叫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

顺便说一句,如果重要的话,我使用 mysql 引擎。

谢谢!

【问题讨论】:

  • 这可能是一个设计问题:样本数据中没有任何内容表明Link .Link ! 是最新的。当您在没有ORDER BY 的情况下执行SELECT * 时获得的顺序是任意的,因此如果您需要非任意顺序,则需要by 来订购。我建议添加一个TIMESTAMP 列来记录下载发生的时间。

标签: mysql sql join sql-order-by


【解决方案1】:

为了能够显示最近的下载,您需要向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 值)。

【讨论】:

  • 我认为你有一个额外的 DESC
  • @Hituptony @YaakovEllis♦ 我在movies_downloads 表中有一个id 列,我确实像你说的那样:ORDER BY movies_downloads.id DESC, movies.id DESC,但它仍然无法正常工作...
  • @ArielAharonson 我用完全不同的方法改变了它。
  • 我没有说两次按ID订购..?
  • @Hituptony 我的错。无论如何,你的回答对我来说并不好,因为我想按 id 排序,而不是 links 列。
猜你喜欢
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2023-01-10
  • 1970-01-01
  • 2012-12-07
相关资源
最近更新 更多