0

我有三个具有这样的分层数据的表:

categories->feeds->channels,其中 feeds 具有 FK category_id,channels 具有 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;

这给了我数据库中每个频道的所有类别,如果 channels.subscribed = 1,则 categories.subscribed = 1。但是,我只希望结果集中每个类别一次,如果有任何频道,则 categories.subscribed 为 1已订阅。所以我尝试使用 group by:

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 语句才能让它工作?感谢您的帮助和时间。

4

2 回答 2

0

好的,所以我根据这个帖子:

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;

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

于 2013-09-23T11:46:24.210 回答
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
于 2013-09-23T11:42:56.957 回答