我需要一个有效的方法来选择标签至少为"Tag1"one_answers"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
在性能方面是否有更有效的方法?
我希望这个查询更快(根据您的条件定制):
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);
然而,最重要的部分是索引。主键将被自动索引(我假设):
- 关于(id)的条目
- article_tag on (articleid, tagid)——多列索引 (id)上的
- 标签
此外,这些将有助于你的情况:
- 标签(name)
- article_tag on (tagid)
这是关系除法的一个特例。这是对你的案子的详尽报道。你会惊讶地发现有这么多好的方法。