我在处理棘手的 SQL 查询时遇到了一些麻烦。
在我的 MySQL 数据库中,有表主题、标签和 tags_topics 加入它们。我想获取共享相同指定标签的主题。例如,假设我有 3 个 ID 为 1、2 和 3 的标签,我想获取与标签 1、2 和 3 相关联的所有主题。主题可以有其他标签,但必须有所有指定的标签。
帮我想想plz xD
编辑:在这个问题中使用 GROUP BY 找到了解决方案:仅获取与连接表中所有条目匹配的行(SQL) 如果有人有更优雅的解决方案,请发布:)
我在处理棘手的 SQL 查询时遇到了一些麻烦。
在我的 MySQL 数据库中,有表主题、标签和 tags_topics 加入它们。我想获取共享相同指定标签的主题。例如,假设我有 3 个 ID 为 1、2 和 3 的标签,我想获取与标签 1、2 和 3 相关联的所有主题。主题可以有其他标签,但必须有所有指定的标签。
帮我想想plz xD
编辑:在这个问题中使用 GROUP BY 找到了解决方案:仅获取与连接表中所有条目匹配的行(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.*
的所有列,除非您使用 MySQL 或 SQLite。GROUP BY
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 */