我需要一种有效的方法来选择至少包含标签“Tag1”和“Tag2”的所有文章。 这是使用以下数据库模式的标准方法:
articles(id, title)
article_tag(articleid, tagid)
tag(id, name)
SELECT a.*
FROM article a
INNER JOIN (SELECT at.articleid
FROM article_tag at
INNER JOIN article a
ON a.id = at.articleid
INNER JOIN tag t
ON t.id = at.tagid
WHERE t.name IN ("Tag1","Tag2")
GROUP BY at.articleid
HAVING Count(at.articleid) = 2) aa
ON a.id = aa.articleid
是否有更有效的表现方式?
答案 0 :(得分:3)
我希望这个查询更快(根据您的条件量身定制):
SELECT a.*
FROM (
SELECT at.articleid AS id
FROM article_tag at
JOIN tag t ON t.id = at.tagid
WHERE t.name = 'Tag1'
) a1
JOIN (
SELECT at.articleid AS id
FROM article_tag at
JOIN tag t ON t.id = at.tagid
WHERE t.name = 'Tag2'
) a2 USING (id)
JOIN article a USING (id);
但是,最重要的部分是索引。主键将自动编入索引(我假设):
此外,这些将有助于您的情况:
这是关系划分的特例。这是一个extensive coverage of your case exactly。你会对有多少好方法感到惊讶。