3

我有 4 张桌子

POST:
id

POST_TAG:
post_id
tag_id
value

TAG:
id

SEARCH:
tag_id
post_tag_value

我需要查询在 SEARCH 表中具有所有标签和值作为行的帖子(不仅仅是标签的一个相等值):

编辑:很抱歉没有提供当前查询和足够的信息。

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 表只有一行,它就可以工作。问题是,当它有更多时。结果应该更少,但实际上更多(如果用 2 行测试,正确的结果是重复的行;我正在寻找交集而不是联合)

添加了 sqlfiddle:http ://sqlfiddle.com/#!2/9cfb9/1

查询的结果是 '1','1','2' 。它应该只有“1”,因为它有两个“标签”,而“2”只有一个。

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)

请注意,在您的小提琴中,id 为 0 的帖子也应该返回,因为它同时具有(0,'yes')(1, 'yes')元组。

于 2012-06-20T17:46:15.120 回答