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)
Run Code Online (Sandbox Code Playgroud)
GROUP BY
解决方案:
请注意,除非您使用 MySQL 或 SQLite,否则您需要列出t.*
子句中的所有列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;
Run Code Online (Sandbox Code Playgroud)
子查询解决方案:
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);
Run Code Online (Sandbox Code Playgroud)
修改后的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
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1212 次 |
最近记录: |