SQLテーブルから最初に保留中のイベントを検索する

テレビガイドのデータが入ったテーブルがあります。

簡略化されたフォームでは、列は次のようになります...

_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

これで各テレビ channel_id に1つのテレビ番組が表示されますが、 TV_GUIDE 表の最後の番組(日付/時間順)が表示されます。

SQLは私の強みではないし、なぜ最後のテレビ番組だけが返されたのか分かり難い。私は、クエリのサブクエリ(またはサブクエリのクエリ)を行う必要があるようです。私は ORDER BY LIMIT の組み合わせを試してみましたが、役に立たないです。

0
group by節に表示されない列は、集合関数内にない限り、選択しないでください。 SELECT * も避ける必要があります。
追加された 著者 Mark Byers,

2 答え

私はあなたの基準に基づいて、まず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と開始時刻を与えます。その後、他の情報を入力します(MySQLでは、単一のクエリから取得することがありますが、同じテーブルを持つJOINから取得することはおそらくフィールドを追加しても機能しません)。

結合フィールド(start_time、channel_id)にインデックスを追加することができます。ただ安全な側にいるために、それをユニークなインデックスにしてください。

1
追加された
+1私はあなたの答えは正しいかもしれないと思うが、私はすべてのデータが正しく返されていることを確認するために再確認する必要があります。私は後で試してみるでしょうが、最初のテストはそれが働いていることを示しています。どうもありがとう。
追加された 著者 Squonk,
ありがとうございます - 少し調整しましたが、私の問題を解決します。
追加された 著者 Squonk,

Limit is what you're looking for, it may just be your syntax. Check this out: How to get Top 5 records in SqLite?

0
追加された