0

TV ガイド データを含むテーブルがあります。

単純化した形式では、列は次のようになります...

_id, title, start_time, end_time, channel_id

私がやろうとしているのは、テレビ番組のリストを NOW/NEXT 形式で作成することです。「NOW」リスト (現在放送されているもの) を生成するのは簡単ですが、「NEXT」を表示しているもののリストを取得しようとすると問題が発生します。

私はこれを試しました...

SELECT * from TV_GUIDE where start_time >= datetime('now') GROUP BY channel_id

案の定、これでテレビごとに 1 つのテレビ番組が表示されますが、テーブルchannel_id内の最後の番組 (日付/時刻順) が表示されTV_GUIDEます。

SQL は私の得意分野ではなく、最後のテレビ番組だけが返される理由を理解するのに苦労しています。クエリのサブクエリ(またはサブクエリのクエリ)を実行する必要があるようです。ORDER BYと の組み合わせを試しましLIMITたが、役に立ちません。

4

1 に答える 1

1

基準に基づいて、最初に TV_GUIDE からカップル (channel_id, ) を選択する必要があると思います。次に、これらの条件に一致する TV_GUIDE のレコードを表示します。

SELECT source.* from TV_GUIDE AS source
JOIN (SELECT channel_id, MIN(start_time) AS start_time
    FROM TV_GUIDE
    WHERE start_time >=  now() GROUP BY channel_id ) AS start_times
ON (source.channel_id = start_times.channel_id 
    AND source.start_time = start_times.start_time)
ORDER BY channel_id;

これにより、最初に各チャンネルに 1 つずつ、最小開始時間を持つすべての番組が選択され、チャンネル ID と開始時間が得られます。次に、同じテーブルの JOIN から他の情報を入力します (MySQL では、単一のクエリから取得できる場合がありますが、取得するのは悪い習慣だと思います。フィールドを追加すると、もう機能しなくなる可能性があります)。

結合されたフィールド (start_time、channel_id) にインデックスを追加することができます。安全のために、UNIQUE インデックスにします。

于 2012-06-24T01:03:18.017 に答える