2015-09-03 3 views
0

Теперь я разрабатываю новостной сайт. У каждой новости есть теги. Пользователь может фильтровать новости по тэгам. Он имеет три поля (все поля являются необязательными для заполнения)Фильтрация элементов в MySQL

1) По крайней мере один тег должен быть в статье

2) Теги, которые должны быть в каждой статье

3) Теги, которые не должны быть в статьях

Теги, связанные с статьи с таблицей

`news_id`|`tag_id` 
    1 | 2 
    4 | 1 
    4 | 4 
    5 | 1 
    5 | 5 
    ... | ... 

Когда пользователь нажимает кнопку Save filter я получаю теги идентификаторами. Как я могу фильтровать news_id с одним запросом mysql?

Теперь у меня есть этот запрос

SELECT * FROM `app_news_newstag` GROUP BY `news_id` HAVING `tag_id` IN ('1', '4', '5') AND `tag_id` NOT IN ('2') 

Я полагаю, что она охватывает первое и третье поля, но я застрял со вторым

ответ

1

Я предложил бы использовать group by и having, как это:

SELECT news_id 
FROM `app_news_newstag` 
GROUP BY news_id 
HAVING sum(tag_id IN ('1', '4', '5')) = 3 AND 
     sum(tag_id` IN ('2')) = 0; 

Сумма найдена количество совпадений. Предполагая, что в статьях нет повторяющихся тегов, вы можете просто подсчитать совпадения для каждой статьи. В числовом контексте MySQL рассматривает логическое выражение как 1 для true и 0 для false, поэтому это работает (без case).

Второе условие просто проверяет, что тег никогда не существует.

Примечание: если идентификаторы являются числовыми, то вы не должны использовать одинарные кавычки для констант. Строковые константы для числовых сравнений вводят в заблуждение.

+0

Хм, но будет ли ваш запрос охватывать второе поле? – Rulisp

+0

Ваш вопрос о 'news_id' и' tag_id' и обработке включения и исключения. Если у вас есть другой вопрос, вы должны задать ему вопрос, с образцами данных и желаемыми результатами. –

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