ユーザーがさまざまな方法でTVガイドを表示できるAndroidアプリを開発しています。ビューの1つは、現在/次のビューです。これは基本的に、セパレーター(チャンネル名を表示)と、各セパレーターの後に現在/次のテレビ番組の詳細が続くリストです。
私が抱えている問題は、67チャネルの自分のラインナップをテストすることで、ビューの生成に20〜30秒かかります(モバイルアプリの場合はひどく遅い)。一部のユーザーは200以上のチャネルを持っていることを知っています。
1つのチャネルのNow/Nextの詳細を取得するために使用するSQLクエリは次のとおりです...
SELECT
b.oid AS _id,
b.channel_oid,
b.title,
b.start_time,
b.end_time
FROM epg_event b,
(
SELECT
MIN(a.start_time) AS start_time,
a.channel_oid,
a.end_time
FROM epg_event a
WHERE a.start_time > datetime('now')
AND a.channel_oid = 10029
GROUP BY a.channel_oid
UNION
SELECT
MIN(a.start_time) AS start_time,
a.channel_oid,
a.end_time
FROM epg_event a
WHERE a.start_time <= datetime('now')
AND a.end_time > datetime('now')
AND a.channel_oid = 10029
GROUP BY a.channel_oid
) c
WHERE c.start_time = b.start_time
AND c.channel_oid = b.channel_oid
ORDER BY b.start_time
これは、最初のレコードの開始時刻が現在の時刻の前(または等しい)で、終了時刻が現在の時刻(現在)の後にあり、2番目のレコードの開始時刻が2つのレコードを取得するクエリでは、かなり複雑に思えます。これは、最初の(次へ)の終了時刻と一致します。
この種のシナリオを照会するためのより効率的な方法があるかどうか疑問に思っています。
epg_eventテーブルは、(スキーマを説明するために)次のように作成されます。
CREATE TABLE [EPG_EVENT] (
[oid] integer PRIMARY KEY,
[title] varchar(50),
[subtitle] varchar(50),
[description] varchar(50),
[start_time] datetime,
[end_time] datetime,
[channel_oid] int,
[unique_id] varchar(50),
[rating] varchar(50),
[original_air_date] datetime,
[season] int,
[episode] int,
[dvb_service_event_id] int,
[dvb_table_version] int,
[genres] varchar(50)
)
表示されたクエリは...を返します。
_id, channel_oid, title, start_time, end_time
10467376, 10029, Ripper Street, 2013-01-20 21:00:00, 2013-01-20 22:00:00
10467377, 10029, BBC News; Regional News and Weather, 2013-01-20 22:00:00, 2013-01-20 22:25:00