我有一些麻烦一个棘手的SQL-查询。

在我数据库里发表的主题、标签和tags_topics加入他们。我想要取一些主题,分享相同的指定标签。例如,让我们说有3个标签与id1、2和3中,我想提取的所有主题,有标签的标1、2和3相关联。主题可以有其他的标签,但是必须有所有指定的标记。

帮我想想。。

编辑:找到一个解决方案使用组通过在这个问题: 获取行匹配的所有条目中加入了表(SQL) 如果任何人有一个更优雅的方案,请后:)

有帮助吗?

解决方案

<强> JOIN溶液

SELECT t.*
FROM topics t
 JOIN tags_topics t1 ON (t.id = t1.topicId AND t1.tagId = 1)
 JOIN tags_topics t2 ON (t.id = t2.topicId AND t2.tagId = 2)
 JOIN tags_topics t3 ON (t.id = t3.topicId AND t3.tagId = 3)

<强> GROUP BY溶液

请注意,你需要列出t.*子句中的所有列GROUP BY,除非你使用MySQL或SQLite的。

SELECT t.*
FROM topics t JOIN tags_topics tt 
  ON (t.id = tt.topicId AND tt.tagId IN (1,2,3))
GROUP BY t.id, ...
HAVING COUNT(*) = 3;

<强>子查询的解决方案:

SELECT t.*
FROM topics t
WHERE t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 1)
  AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 2)
  AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 3);

<强>改性GROUP BY溶液

通过在子查询中分离搜索简化GROUP BY子句。

SELECT t.*
FROM topics t
WHERE t.id IN (
  SELECT tt.topicId FROM tags_topics tt 
  WHERE tt.tagId IN (1,2,3))
  GROUP BY tt.id HAVING COUNT(*) = 3
);

其他提示

SELECT 
    topic_id
FROM
    tags_topics
WHERE
    tag_id IN (1,2,3)
GROUP BY
    topic_id
HAVING
    COUNT(*) > 2  /* or use COUNT(*) = 3 if you know that there cannot be duplicates in the junction table */
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top