繁体   English   中英

MySQL查询四个表 - '交叉'

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM