4

我有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

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

4

2 回答 2

3

你会想要更换

ORDER BY albums.date

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

这将首先按专辑日期排序,然后是其中的视频日期,以及其中的故事日期。我认为这会让你得到你正在寻找的东西。

于 2012-10-30T15:47:18.293 回答
1

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

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 唯一的问题是您必须在每个基础查询中返回相同的列,因此如果您想要从专辑中获取与视频中截然不同的信息,这将变得很棘手。

于 2012-10-30T16:42:09.720 回答