MySQL多对多选择 - 最佳实践

时间:2015-01-27 21:03:16

标签: mysql

我正在寻找最佳做法,以便为所有News_ID添加三个类别。

    -- Table: news_categories
    +-------------+---------+
    | category_id | news_id |
    +-------------+---------+
    |           2 | 2       |
    |           2 | 3       |
    |           7 | 3       |
    |          14 | 2       |
    |           2 | 4       |
    |          12 | 3       |
    |          12 | 2       |
    +-------------+---------+

到目前为止,这是我的SQL:

    SELECT DISTINCT a.news_id
    FROM news_categories a, news_categories b, news_categories c
    WHERE 
    a.news_id = b.news_id AND b.news_id = c.news_id
    AND a.category_id =2
    AND b.category_id =7
    AND c.category_id =12

查询返回news_id 3这是我想要的,但这是要走的路吗?如果有更多类别加入,性能如何?

1 个答案:

答案 0 :(得分:3)

要消除联接,请按news_id分组并计算category_ids。如果类别ID的数量是您要查找的数量,则可以找到它们。

SELECT news_id, COUNT(category_id)
FROM t1_news_categories
WHERE category_id IN (2, 7, 12)
GROUP BY news_id
HAVING COUNT(category_id) = 3

在这里添加一些关于性能的内容,我不确定这与原始查询的速度有多快。但是,一旦你开始在原始查询中添加更多类别(连接),那么我认为这肯定会更快。编码也比根据您要查找的类别动态创建查询更容易。