2014-05-21 56 views
1

我有一個SQLite數據庫是PVR應用程序的一部分。其中一個表(epg_event)包含電視節目的所有數據。從同一個表中加入兩個結果集?

我想寫一個查詢,它將返回現在和下一個單一記錄中的現在/下一個顯示。

我可以很容易地單獨查詢兩個。

自身看起來像這樣現在查詢......

SELECT now.channel_oid as _id, 
     now.oid as now_oid, 
     now.title as now_title, 
     now.start_time as now_start_time, 
     now.end_time as now_end_time 
FROM epg_event now 
WHERE now.start_time <= datetime('now') AND now.end_time > datetime('now') 
ORDER BY now.channel_oid 

這個偉大的工程,並在測試中我得到了我所需要的。例如...

_id  now_oid  now_title now_start_time   now_end_time 
10029 16365522 BBC News 2014-05-21 00:45:00 2014-05-21 05:00:00 
10030 16365900 Making Art 2014-05-21 03:00:00 2014-05-21 04:00:00 
... 

自身看起來像這樣下一個查詢...

SELECT next.channel_oid as _id, 
     next.oid as next_oid, 
     next.title as next_title, 
     MIN(next.start_time) as next_start_time, 
     next.end_time as next_end_time 
FROM epg_event next 
WHERE next.start_time > datetime('now') 
GROUP BY next.channel_oid 

這也返回下一個電視節目正確的結果。

我遇到的問題是我試圖結合兩個查詢返回每個通道的單個記錄與現在和下一個數據,但我不知道如何做到這一點。我想我需要使用某種類型的JOIN,但是我的SQLite工具在我嘗試時會一直拋出錯誤。

理想的情況是我想要做的就是讓每排一個_id列和現在/下一列組合成排,所以我有以下列...

_id now_oid now_title now_start_time now_end_time next_oid next_title next_start_time next_end_time 

是否有可能對來自同一個表的兩個查詢使用JOIN,還是應該使用別的東西?

+0

爲什麼不使用row_over查詢。它們是用這樣的實例設計的。用分區和下一個搜索行。互聯網充斥着代碼示例。 –

+0

@AnthonyHorne:好的,我來看看。 SQL不是我的強項,除了基本查詢以外的任何事情總是讓我頭疼。 – Squonk

+0

這是一個很好的例子:http://www.kodyaz.com/articles/sql-select-previous-and-next-rows-with-current-row-in-tsql.aspx –

回答

1

非常感謝梅里指着我在正確的方向。它經歷了一些試驗和錯誤,但我現在正在得到我正在瞄準的東西。

SELECT A.channel_oid AS _id, A.oid AS now_oid, A.title AS now_title, 
     A.start_time AS now_start_time, A.end_time AS now_end_time, 
     B.oid AS next_oid, B.title AS next_title, B.start_time AS next_start_time, 
     B.end_time AS next_end_time 
FROM (
    SELECT channel_oid, 
     oid, 
     title, 
     start_time, 
     end_time 
    FROM epg_event 
    WHERE start_time <= datetime('now') AND end_time > datetime('now') 
    ORDER BY channel_oid) AS A 
JOIN (
    SELECT channel_oid, 
     oid, 
     title, 
     MIN(start_time) as start_time, 
     end_time 
    FROM epg_event 
    WHERE start_time > datetime('now') 
    GROUP BY channel_oid) AS B 
ON A.channel_oid = B.channel_oid 
3

我猜channel_oid, oid是候選關鍵。在它最簡單的形式,你可以加入兩個查詢,如(未經測試):

SELECT A._id, A.now_oid, ..., B.title, ... 
FROM (
    SELECT now.channel_oid, 
     now.oid, 
     now.title, 
     now.start_time, 
     now.end_time, 
    FROM epg_event now 
    WHERE now.start_time <= datetime('now') AND now.end_time > datetime('now') 
) AS A 
JOIN (
    SELECT next.channel_oid, 
     next.oid, 
     next.title, 
     MIN(next.start_time) as start_time, 
     next.end_time 
    FROM epg_event next 
    WHERE next.start_time > datetime('now') 
    GROUP BY next.channel_oid 
) AS B 
    ON A.channel_oid = B.channel_oid 
    AND A.oid = B.oid 
ORDER BY A.channel_oid 
+0

這不斷給FROM附近的語法錯誤(我沒有從您的例子中刪除...並將其替換爲相應的值)。 – Squonk

+0

我沒有sqllite,所以我不能嘗試我的自我。嘗試'SELECT A.channel_oid FROM( SELECT now.channel_oid, now.oid, now.title, now.start_time, now。end_time, FROM epg_event now WHERE now.start_time <= datetime('now')AND now.end_time> datetime('now') )AS A' – Lennart

+0

同樣的錯誤。我已經試過把它切回來。也許這是一個SQLite的東西。 – Squonk