3

私は4つのテーブルを持っています

POST:
id

POST_TAG:
post_id
tag_id
value

TAG:
id

SEARCH:
tag_id
post_tag_value

すべてのタグと値がSEARCHテーブルの行として含まれている投稿をクエリする必要があります(タグの1つの等しい値だけではありません)。

編集:現在のクエリと十分な情報を提供していないことをお詫び申し上げます。

SELECT POST.id FROM POST,POST_TAG, SEARCH
WHERE
      POST.id = POST_TAG.post_id AND
      POST_TAG.tag_id= SEARCH.tag_id AND
      POST_TAG.value = SEARCH.value;

SEARCHテーブルに1行ある場合に機能します。問題は、それがもっとあるときです。結果は少なくなるはずですが、実際には多くなります(2行でテストした場合、適切な結果は重複した行です。私は和集合ではなく交差を探しています)

追加されたsqlfiddle:http ://sqlfiddle.com/#!2/9cfb9/1

クエリの結果は「1」、「1」、「2」です。「2」には1つしかないのに対し、両方の「タグ」があるため、「1」のみにする必要があります。

4

2 に答える 2

2

あなたのsqlfiddleによると、答えはこれかもしれません:

-- i want to select post that match to EVERY tag
-- the result of example data should be only '1'
SELECT POST.id as 'tag_id'
FROM POST,POST_TAG, SEARCH
WHERE
      POST.id = POST_TAG.post_id AND
      POST_TAG.tag_id= SEARCH.tag_id AND
      POST_TAG.value = SEARCH.value
GROUP BY POST.id
having COUNT(distinct POST_TAG.tag_id) = (select count(distinct tag_id) from POST_TAG);
于 2012-06-20T13:42:27.563 に答える
2

実例:http ://sqlfiddle.com/#!2/393eb / 39

SELECT pt.post_id
FROM SEARCH s INNER JOIN post_tag pt ON pt.tag_id = s.tag_id AND pt.value = s.value
GROUP BY pt.post_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM SEARCH)

(0,'yes')フィドルでは、と(1, 'yes')タプルの両方が含まれているため、ID0の投稿も返される必要があることに注意してください。

于 2012-06-20T17:46:15.120 に答える