MySQL查询四个表 - '交叉'

时间:2012-06-20 13:33:41

标签: mysql sql sql-match-all

我有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'只有一个。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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')元组。