【问题标题】:SQL Query on four tables with MySQL - 'intersection'使用 MySQL 对四个表进行 SQL 查询 - 'intersection'
【发布时间】:2012-06-22 15:54:53
【问题描述】:

我有 4 张桌子

POST:
id

POST_TAG:
post_id
tag_id
value

TAG:
id

SEARCH:
tag_id
post_tag_value

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

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

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 行测试,正确的结果是重复的行;我正在寻找 intersection 而不是 union)

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

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

【问题讨论】:

  • 太棒了。让我们看看到目前为止您有什么查询,有人会帮助您(将其编辑到您的问题中,而不是将其添加到 cmets)。
  • 至少在sqlfiddle.com上提供一些数据
  • 阅读这个问题有很多方法可以做到这一点:How to filter SQL results in a has-many-through relation
  • 你以前用过SQL吗?你已经尝试了吗?
  • 要求不太清楚。显示示例数据和所需的输出。

标签: mysql sql sql-match-all


【解决方案1】:

工作示例: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') 元组。

【讨论】:

  • 取点,0和1应该返回yes,所以这是正确的方法。
【解决方案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);

【讨论】:

  • 这项工作,但创建一个结果的 UNION 而不是一个 INTERSECTION
  • 我想选择与每个标签匹配的帖子示例数据的结果应该只有'1'sqlfiddle.com/#!2/393eb/1
  • @2fingers 我已经编辑了我的答案,你可以测试一下。这是你想要的吗?
  • 你的回答很有用。我只需要修改最后一行,以便从 SEARCH 表中计算 tag_id。我不知道这是否是最佳查询,但它确实有效。谢谢!
  • 如果有一天某个帖子的标签数量超过了搜索的数量,它就不会起作用,我想你已经知道了,但我想提醒一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多