[英]SQL Query on four tables with MySQL - 'intersection'
我有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'只有一个。
根据你的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);
工作示例: 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')
元组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.