【问题标题】:How to join 3 tables and order by date of all 3?如何加入 3 个表并按所有 3 个的日期排序?
【发布时间】:2012-10-30 15:42:49
【问题描述】:

我有 3 张桌子,

专辑、视频和故事。

所有 3 个都有一个日期列,每个都与 subject_id 列连接。

我想选择按日期排序的 subject_id 的所有专辑、视频和故事,我该怎么做?

现在我有这个查询:

SELECT albums.*, videos.*, stories.*
FROM albums
LEFT JOIN videos
ON videos.subject_id = albums.subject_id
RIGHT JOIN stories
ON stories.subject_id = albums.subject_id
ORDER BY albums.date

这能解决问题还是我错过了什么? 因为我不希望日期仅按专辑排序,所以故事可能有较旧的条目,然后是专辑等等。

【问题讨论】:

  • 那么您的查询有什么问题?
  • 它没有按预期订购它们......
  • 如果你能得到样本结果会更好
  • 这是一个示例查询,只是想了解其背后的逻辑,如何按 1 个共享列对 3 个表进行排序,尚未确定我需要什么结果
  • 很难得到你真正想做的事,Scott 提供了一个答案,但它似乎没有做你真正想做的事。

标签: sql join


【解决方案1】:

你会想要替换

ORDER BY albums.date

ORDER BY albums.date, videos.date, stories.date

这将首先按专辑日期排序,然后是其中的视频日期,然后是其中的故事日期。我认为这会让你得到你想要的。

【讨论】:

  • 我希望他们一起订购,而不是一个接一个
  • @eric.itzhak 一起订购是什么意思?
  • 所有 3 个表都有日期列,我希望结果按未按表分组的所有日期排序。意思是如果专辑有 2 行,1 行在 2012 年,1 行在 2010 年,故事有 1 行在 2011 年,1 行在 2009 年,所以结果将是 2009-2010-2011-2012(当然这些是完整日期)
  • 那你就得用join以外的东西了。
【解决方案2】:

如果我理解正确,假设您总是想按集合中最早日期的升序排序,您可以这样做:

ORDER BY LEAST(albums.date, videos.date, stories.date)

“LEAST”是一个 Oracle 函数,它返回集合中的最小(即最早)值。如果您在没有类似命令的数据库上,您可以使用 CASE 语句:

ORDER BY CASE
    WHEN albums.date <= videos.date AND albums.date <= stories.date THEN albums.date
    WHEN videos.date <= albums.date AND videos.date <= stories.date THEN videos.date
    ELSE stories.date

虽然我也不确定这是否是您想要的。您将在一行中放置一大排所有专辑、视频和故事信息。如果您想为每个不同的专辑、视频或故事设置一行,那么您可能需要一个 UNION 而不是一组 JOIN,尽管您必须确保使用相同的字段。例如,如果您想查看每个表中的标题字段,则可以使用:

SELECT * FROM (
    SELECT 'Album' as RowType, album_title as title, subject_id, date from albums
    UNION
    SELECT 'Video' as RowType, video_title as title, subject_id, date from videos
    UNION
    SELECT 'Story' as RowType, story_title as title, subject_id, date from stories
    )
ORDER BY subject_id, date

这将给出我认为您想要的排序顺序(或者如果您愿意,您可以将 subject_id 从 ORDER BY 中取出)。 UNION 唯一的问题是您必须在每个基础查询中返回相同的列,因此如果您想要从专辑中获取与视频中截然不同的信息,这将变得很棘手。

【讨论】:

  • 谢谢芯片,这正是我所需要的!忘记了 UNION :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多