如果我理解正确,假设您总是想按集合中最早的日期按升序排序,您可以这样做:
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 唯一的问题是您必须在每个基础查询中返回相同的列,因此如果您想要从专辑中获取与视频中截然不同的信息,这将变得很棘手。