2014-05-21 3 views
1

나는 PVR 앱의 일부인 SQLite DB를 가지고 있습니다. 테이블 중 하나 (epg_event)는 TV 프로그램의 모든 데이터를 보유합니다.동일한 테이블에서 두 개의 결과 세트가있는 JOIN?

Now와 Next 모두에 대한 단일 레코드에서 Now/Next 쇼를 반환하는 쿼리를 작성하려고합니다.

둘 다 쉽게 개별적으로 쿼리 할 수 ​​있습니다.

이 같은 자신의 모습에 이제 쿼리

...

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 

이 또한 다음 TV 프로그램에 대한 올바른 결과를 반환합니다.

내가 겪고있는 문제는 두 개의 쿼리를 결합하여 지금과 다음 데이터가있는 각 채널에 대한 단일 레코드를 반환하려고하지만이를 수행하는 방법을 찾지 못한다는 것입니다. 내가 일종의 조인을 사용해야하지만 내 SQLite 도구를 시도 할 때마다 오류가 발생하는 것으로 생각하고 있습니다.

이상적으로 난 할 노력하고있어 그래서 ...

_id now_oid now_title now_start_time now_end_time next_oid next_title next_start_time next_end_time 

이 가능 다음과 같은 열이인가 한 각 행에 하나의 _id 컬럼을 얻고 행에 현재/다음 열을 결합입니다 동일한 테이블의 두 개의 쿼리에서 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 now.channel_oid, now.oid, now.title, 지금 now.start_time, (FROM A.channel_oid 을 선택'보십시오.end_time, 지금 epg_event에서 WHERE now.start_time <= datetime ('now') AND now.end_time> datetime ('now') ) AS A ' – Lennart

+0

같은 오류가 발생했습니다. 나는 이미 그것을 다시 자르려고했다. 아마도 그것은 SQLite 일입니다. – Squonk

관련 문제