2013-09-23 41 views
0

一個布爾專欄中,我有三個表與分層數據是這樣的:SQL語句來創建基於外國表的布爾列

分類 - > Feed中,>,其中飼料具有FK CATEGORY_ID和渠道渠道有FK FEED_ID 。

通道具有訂閱的布爾值。我想要選擇所有類別,並創建一個訂閱(布爾)列,如果任何一個訂閱源中的任何通道爲'1',那麼它的列爲'1'。我正在使用SQLite。

首先我嘗試這樣做:

SELECT categories.category_id, categories.title, 
    CASE when (channels.subscribed = 1) THEN 1 ELSE 0 END AS subscribed 
FROM categories 
    JOIN feeds ON categories.category_id = feeds.category_id 
    JOIN channels ON feeds.feed_id = channels.feed_id; 

這給了我所有類別數據庫中的每一個通道,與categories.subscribed = 1,如果channels.subscribed = 1。然而,我只是想一次每個類別在結果集中,具有類別。如果任何頻道訂閱,則訂閱爲1。所以,我想通過使用組:

SELECT categories.category_id, categories.title, 
    CASE when (channels.subscribed = 1) THEN 1 ELSE 0 END AS subscribed 
FROM categories 
    JOIN feeds ON categories.category_id = feeds.category_id 
    JOIN channels ON feeds.feed_id = channels.feed_id; 
GROUP BY categories.category_id; 

這給我的結果集,我想,但認購列是不正確的,可以預見:

id|title|subscribed 
38|cat1|0 
19|cat2|0 

,而我想這一點:

38|cat1|0 
19|cat2|1 

,因爲在cat2中有一個包含訂閱渠道的供稿。有沒有我可以使用的函數,或者可能需要一個更復雜的CASE語句,我必須使這個語句正常工作?感謝您的幫助和時間。

回答

0
SELECT categories.category_id, categories.title, 
(select count(distinct channels.subscribed) 
from feeds, channels 
where categories.category_id = feeds.category_id 
    and feeds.feed_id = channels.feed_id 
    and channels.subscribed = 1) 
FROM categories 
+0

這產生了正確的輸出,但我的也是如此。這比我的回答好嗎? 「更好」,因爲這是在android平臺上執行的,所以我猜內存使用率或整體效率?你怎麼看?另一個問題是我必須將其轉換爲ContentProvider,並且直接連接比子選擇更容易... – d370urn3ur

0

OK,所以我根據這個帖子:

http://weblogs.sqlteam.com/jeffs/archive/2004/07/11/1744.aspx

我可以使用 「總布爾OR」 功能,這是剛上訂閱列MAX(),以獲得我想要什麼,這是我的想法,我只是不能把它放到SQL中。所以這對我有用:

SELECT categories.category_id, categories.title, 
    MAX(CASE when (channels.subscribed = 1) THEN 1 ELSE 0 END) AS subscribed 
FROM categories 
    JOIN feeds ON categories.category_id = feeds.category_id 
    JOIN channels ON feeds.feed_id = channels.feed_id; 
GROUP BY categories.category_id; 

如果有人有更好的答案,請發佈它。