我有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'只有一个。
答案 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')
元组。