2013-09-23 32 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; 

如果有人有更好的答案,请发布它。