2012-03-29 9 views
0

このコードは期待どおりに機能しませんでした。私は、しかし、ここで紹介されていない任意のタグなしで、一緒にまたは別々に、TAGS 561, 562を持っているすべての記事を選択したい - >>>IN (561, 562)投稿が間違って選択される

SELECT post_id_post 
FROM post_has_tags 
WHERE tags_id_tags IN (561, 562) 
HAVING COUNT(tags_id_tags) <= 2 

post_id_post  tags_id_tags  
600     561 
600     562 
600     917 // 917 is not inside IN (561, 562) 

しかし、このコードが出力されますポスト600は、それは間違っています、正しい結果が得られないはずです。

おかげ

ここ

答えて

4

はこれを試してみてください(あなたがタグのために別のテーブルを持っていると仮定します):

select distinct p1.post_id_post from post_has_tags p1 
where not exists (
    select * from post_has_tags p2 
    where p1.post_id_post = p2.post_id_post and p2.tags_id_tags not in (561, 562) 
) 

私はフィル未満にしたくないので、私はあまりにも私のfiddleを追加している:)

+0

をあなたはもっと簡潔なクエリを持つために私から1を取得します。あなたは私の答えにあるように、外部クエリに 'WHERE .. IN'は必要ありません。 – Phil

+0

@Phil:すばらしいおかげで! :) –

2
SELECT DISTINCT pht.post_id_post -- the distinct is to avoid duplicates 
FROM post_has_tags pht 
WHERE pht.tags_id_tags IN (561, 562) 
AND NOT EXISTS (
    SELECT 1 FROM post_has_tags _pht 
    WHERE _pht.post_id_post = pht.post_id_post 
    AND _pht.tags_id_tags NOT IN (561, 562) 
); 

デモ - http://sqlfiddle.com/#!2/cdef3/3

0

多分ビット行き過ぎしかし:

SELECT post_id_post 
FROM post_has_tags 
WHERE tags_id_tags IN (561, 562) 
AND tags_id_tags NOT IN (SELECT DISTINCT(tag_id) FROM tags WHERE tag NOT IN (561, 562)); 

関連する問題