这与我的上一个问题mysql query with AND, OR and NOT
有关我没有编辑问题,而是问一个新问题,因为这个问题只是上一个问题的一部分,并且有改动。
我希望做一个mysql查询,它会返回所有包含所有必需主题的文章。
Article
id
....
Topic
id
....
ArticleTopics
article_id
topic_id
type
有效的事情:
SELECT * FROM Article LEFT JOIN ArticleTopics ON Article.id = ArticleTopics.article_id
WHERE ArticleTopics.topic_id HAS ALL (these topics)
这可能吗?对此最好的方法是什么?
答案 0 :(得分:3)
其他几个答案建议在子表上为每个过滤器子句使用别名 - 这可能效率不高或可以很好地扩展。
考虑:
SELECT x.*
FROM Article x INNER JOIN
(SELECT t.article_id, COUNT(t.article_id)
FROM articleTopics t
WHERE t.topic_id IN ([your_list_of_topics])
GROUP BY t.article_id
HAVING COUNT(t.article_id)>=[number of elements in [your_list_of_topics]]
ORDER BY COUNT(t.article_id) DESC
LIMIT 0,100) AS ilv
ON x.id=ilv.article_id
这种方法的另一个优点是查询的结构不需要根据您要搜索的主题数量进行更改 - 您甚至可以将它们放在临时表中并执行连接而不是使用'IN (...)'字面意思。
您需要尝试一下,看看哪个查询行为更好。
答案 1 :(得分:1)
使用同一个表的多个连接完成。
要选择所有包含ID为1,2和3的主题的文章,您需要执行以下操作:
SELECT * FROM Article a
INNER JOIN ArticleTopics at1 ON a.id = at1.article_id AND at1.topic_id = 1
INNER JOIN ArticleTopics at2 ON a.id = at2.article_id AND at2.topic_id = 2
INNER JOIN ArticleTopics at3 ON a.id = at3.article_id AND at3.topic_id = 3
//编辑 固定它。添加表别名;我必须长时间使用好的ORM解决方案...
答案 2 :(得分:0)
SELECT
*
FROM
Article
WHERE
(SELECT COUNT(*) FROM ArticleTopics
WHERE Article.id = ArticleTopics.article_id AND
ArticleTopics.topic_id=1) > 0 AND
(SELECT COUNT(*) FROM ArticleTopics
WHERE Article.id = ArticleTopics.article_id AND
ArticleTopics.topic_id=2) > 0 AND
(SELECT COUNT(*) FROM ArticleTopics
WHERE Article.id = ArticleTopics.article_id AND
ArticleTopics.topic_id=3) > 0 AND
...