MySQL запрос с AND, OR и NOT - PullRequest
       54

MySQL запрос с AND, OR и NOT

6 голосов
/ 11 ноября 2010

Допустим, у меня есть таблица статей, в которых столько или много взаимосвязей с темами.Каждая тема, назначенная статье, имеет поле type, которое может содержать 1 из 3 значений AND, NOT и OR.

Articles
   id
   ....

Topics
   id
   ....

ArticleTopics
   article_id
   topic_id
   type

Я хочу создать запрос, который возвращаетвсе статьи, которые имеют:

ALL of the following topics: 1, 2, 3 (AND association)
   AND
ANY of the following topics: 4, 5, 6 (OR association)
   AND
NONE of the following topics 7, 8 (NOT association)

Как мне создать этот запрос?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

Части ALL и NOT очень просты, вы просто цепляете их с помощью AND:

ВЫБРАТЬ X ИЗ Y ГДЕ a, b, c, И НЕ d, e И НЕ e.

И ИЛИ находятся между:

ВЫБРАТЬ X ИЗ Y ГДЕ ((a И b И C) И (d ИЛИ ИЛИ f)) И НЕ g И НЕ h

заменить небольшие числа сравнениями, и все готово. Так что, если вы хотите сделать это в коде, отсортируйте ваши условия, а затем просто объедините их в цепочку. Будьте осторожны, чтобы избежать SQL-вставок.

0 голосов
/ 11 ноября 2010
SELECT a.id, a.name 
  FROM Articles a, ArticleTopics arto
  WHERE arto.article_id = a.id 
    AND 
      ((arto.topic_id = 1 AND arto.type like 'AND') AND (arto.topic_id = 2 AND arto.type like 'AND') AND (arto.topic_id = 3 AND arto.type like 'AND')) 
    AND
      ((arto.topic_id = 4 AND arto.type like 'OR') AND (arto.topic_id = 5 AND arto.type like 'OR') AND (arto.topic_id = 6 AND arto.type like 'OR'))
    AND
      ((arto.topic_id = 7 AND arto.type like 'NOT') AND (arto.topic_id = 8 AND arto.type like 'NOT'))
0 голосов
/ 11 ноября 2010

Если я правильно понял

    SELECT * FROM ArticleTopics where type = 'AND'
UNION
    SELECT * FROM ArticleTopics where type = 'OR' limit 1

Я предполагаю, что под «любым» вы подразумеваете «любой». Вы можете сами присоединить статьи к темам, это тривиально.

...