我有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
这会解决这个问题还是我错过了什么? 因为我希望日期不是仅按专辑排序,所以故事可能有较旧的肠道,然后是专辑等等。
答案 0 :(得分:3)
您需要替换
ORDER BY albums.date
与
ORDER BY albums.date, videos.date, stories.date
这将首先按专辑日期排序,然后按照该视频日期排序,并在其中排列故事日期。我想这会让你得到你想要的东西。
答案 1 :(得分:1)
如果我理解正确,假设你总是希望按照集合中最早的日期按升序排序,你可以这样做:
ORDER BY LEAST(albums.date, videos.date, stories.date)
“LEAST”是一个Oracle函数,它返回集合中的最小(即最早)值。如果您在没有simliar命令的数据库上,则可以使用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
哪个会给出我认为你想要的排序顺序(或者如果你愿意,你可以从ORDER BY中取出subject_id)。关于UNION的唯一问题是你必须在每个底层查询中返回相同的列,所以如果你想从专辑而不是视频中获得截然不同的信息,那么它将变得棘手。