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

これがあなたが望むものかどうかはわかりませんが。アルバム、ビデオ、およびストーリーのすべての情報が 1 行に表示される大きな行が作成されます。異なるアルバム、ビデオ、またはストーリーごとに行が必要な場合は、おそらく JOIN のセットではなく UNION が必要ですが、同じフィールドを使用していることを確認する必要があります。たとえば、表示したい各テーブルにタイトル フィールドがある場合は、次のように使用できます。

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 に関する唯一のことは、基礎となる各クエリで同じ列を返す必要があるということです。そのため、ビデオとアルバムから大幅に異なる情報が必要な場合は、注意が必要です。

于 2012-10-30T16:42:09.720 に答える