1

itemsテーブルとtagsテーブルを介してリンクされているテーブルがありuser_tagsます。特定のタグを持つすべてのアイテムを検索するクエリがあります。

self::factory('item')
    ->join('user_tags', 'INNER')->on('items.id', '=', 'user_tags.item_id')
    ->join('tags', 'INNER')->on('user_tags.tag_id', '=', 'tags.id')
    ->where('tags.title', 'IN', $array_of_tags);

またはkohanaormなし:

SELECT items.*
FROM items
INNER JOIN user_tags ON items.id = user_tags.item_id
INNER JOIN tags ON user_tags.tag_id = tags.id
WHERE tags.title IN ($array_of_tags);

タグが関連付けられていないすべてのアイテムを検索したいと思います。どうすればいいですか?

4

3 に答える 3

1

別の where 条件を追加するだけです

SELECT 
    items.*
FROM items
LEFT JOIN user_tags ON items.id = user_tags.item_id
LEFT JOIN tags ON user_tags.tag_id = tags.id
WHERE tags.title IN ($array_of_tags)
AND user_tags.tag_id IS NULL;
于 2013-01-21T19:06:26.660 に答える
1

内部結合を左結合に切り替えます

SELECT items.*
FROM items
LEFT JOIN user_tags ON items.id = user_tags.item_id
LEFT JOIN tags ON user_tags.tag_id = tags.id
WHERE (tags.title IN ($array_of_tags) or tags.title is null)
and user_tags.item_Id is null.

SQL は設定されたロジック以上のものではないことに注意してください。

さまざまなタイプの結合を説明するのに役立つリンクを次に示します。

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

于 2013-01-21T19:08:35.397 に答える
0

これを試して::

SELECT items.*
FROM items
LEFT JOIN user_tags ON items.id = user_tags.item_id
LEFT JOIN tags ON user_tags.tag_id = tags.id
WHERE 
user_tags.tag_id is null 
AND tags.title IN ($array_of_tags)
于 2013-01-21T19:07:28.667 に答える