2015-01-27 3 views
0

Я ищу лучшую практику, чтобы получить все News_IDs с тремя категориями.MySQL-много-для-многих Выберите - Лучшая практика

 
    -- 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, который является то, что я хочу, но это путь? Как насчет производительности при включении еще большего числа категорий?

ответ

3

Чтобы устранить объединения, соберите news_id и посчитайте category_ids. Если количество идентификаторов категории - это то, сколько вы ищете, вы их нашли.

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 

Просто чтобы добавить что-то о производительности здесь, я не уверен, насколько быстрее это по сравнению с исходным запросом. Однако, если вы начнете добавлять в исходный запрос больше категорий (объединений), то я думаю, что это определенно будет быстрее. Это также будет легче кодировать, чем пытаться динамически создавать запрос на основе того, сколько категорий вы ищете.

+0

Ничего себе, это выглядит умным и приятным - и это работает просто отлично! Вы знаете о производительности? Это лучше, чем использование объединений? – chris

+0

Я не гуру производительности, но я только что добавил что-то о производительности. Если он работает быстро, то, по крайней мере, у вас есть рабочая программа. Я бы подождал, пока вы не начнете добавлять больше категорий и не заметите, что ваши запросы работают медленнее, прежде чем тратить много времени, пытаясь максимизировать производительность на что-то, что может не быть проблемой. Я хотел бы видеть, имеет ли кто-либо еще информацию о производительности соединений по сравнению с этим. –

Смежные вопросы