0

私は多くのテーブルとの結合が苦手で、これを SQLite に入れるのに苦労しています。これらのテーブルを含むデータベースがあります。

Feeds->Channels->RegionsChannels->Regions。

ここで、Channels は、RegionsChannels を介して Regions への 0 個以上の接続を持つことができます。

地域には、ユーザーがこの地域を有効にしたかどうかを示すブール フィールド (0, 1) があります。

フィードからいくつかのフィールドを取得したいと考えています。たとえば、地域に接続されていないか、地域に接続されているチャネルを含むすべてのフィードの Feeds.id と Feeds.title で、Regions.selected = 1;

次のようにすべてのテーブルを結合してみました。

select feeds.feed_id, feeds.title
from feeds
    left outer join channels on feeds.feed_id = channels.feed_id
    left outer join regions_channels on channels.channel_id = regions_channels.channel_id
    left outer join regions on regions_channels.region_id = regions.region_id
        and regions.selected = 1
group by feeds.feed_id
order by feeds.feed_id;

選択した地域のみを取得しようとしましたが、とにかくすべてのフィードが返されました。リージョン テーブルで RIGHT OUTER JOIN を実行する必要があるのではないかと考えましたが、SQLite を使用しており、RIGHT OUTER JOIN または FULL OUTER JOIN をサポートしていません。

アップデート:

私はこれを試してみましたが、まさに私が望むものを手に入れています。いくつかのregion.selectedを切り替えましたが、毎回うまくいきます。しかし、それが本当に機能するのか、それとも機能しているように見えるだけなのか、私にはわかりません。

select feeds.feed_id, feeds.title
from feeds
    left outer join channels on feeds.feed_id = channels.feed_id
    left outer join regions_channels on channels.channel_id = regions_channels.channel_id
    left outer join regions on regions_channels.region_id = regions.region_id
where regions._id is NULL
    or regions.selected = 1
group by feeds.feed_id
order by feeds.feed_id;

これは私には適切ではありませんが、機能するので、今のところ使用しています...

4

2 に答える 2

0

最後ANDはトリミングregions台でした。

regions.selected=1WHERE節にある必要があります。

を選択するNOT region.selected IS 0と、無効になっていないすべてのフィードが表示されます。

-IMO に置き換えGROUP BYDISTINCT方が正確です。

LEFTまたはLEFT OUTERでも同じです。

SELECT DISTINCT feeds.feed_id, feeds.title
FROM feeds
    LEFT JOIN channels ON feeds.feed_id = channels.feed_id
    LEFT JOIN regions_channels ON channels.channel_id = regions_channels.channel_id
    LEFT JOIN regions ON regions_channels.region_id = regions.region_id
WHERE NOT regions.selected IS 0
ORDER BY feeds.feed_id;
于 2013-10-01T14:12:34.987 に答える
0

By putting selected = 1 into the join condition, you have told the database to return either records that match that condition, or (because of OUTER), to return columns filled with NULL. You must put the condition into the WHERE clause so that it is checked after the join.

Second change: I've dropped the LEFT OUTER fropm the feeds/channels join because you did not say you wanted feeds that do not have channels.

SELECT feeds.feed_id, feeds.title
FROM feeds
JOIN channels ON feeds.feed_id = channels.feed_id
LEFT JOIN regions_channels ON channels.channel_id = regions_channels.channel_id
LEFT JOIN regions on regions_channels.region_id = regions.region_id
WHERE regions.selected = 1
   OR regions.selected IS NULL
GROUP BY feeds.feed_id
ORDER BY feeds.feed_id
于 2013-10-01T14:11:08.137 に答える