2014-05-21 59 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