MySQL комплекс присоединяется - PullRequest
0 голосов
/ 11 ноября 2010

Это относится к запросу mysql с AND, OR и NOT , а также к mysql имеет все значения Я решил часть проблемы AND, но теперь я тоже сейчас нужно решить OR и NOT.

Просто чтобы подтвердить приведенное ниже утверждение, я получаю все статьи, в которых есть каждая тема 1, 2 и 3

SELECT x.*
FROM Article x INNER JOIN
(SELECT t.article_id, COUNT(t.article_id)
  FROM articleTopics t
  WHERE t.topic_id IN ('1','2','3')
  GROUP BY t.article_id
  HAVING COUNT(t.article_id)>=3
  ORDER BY COUNT(t.article_id) DESC
  LIMIT 0,100) AS ilv
ON x.id=ilv.article_id

Я пытаюсь добавить в запрос что-то, что исключило бы все статьи, которые также связаны с темами 4 и 5.: NOT

Я также хочу добавить статьи, имеющие темы 6 или 7, если они соответствуют предыдущим ограничениям.

1018 * Е.Г. *

SELECT all Articles where the articles has
    all the following topics (1,2,3) #AND
AND
    none of the following topics (4,5) #NOT
AND
    may have any of the following topics(6,7) #OR

Надеюсь, это имеет смысл!

Ответы [ 3 ]

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

Кажется, что было бы намного проще использовать обычный JOIN, чем использовать подвыбор.Должно быть и быстрее.

SELECT * FROM articles JOIN articleTopics USING(article_id) 
 WHERE topic_id IN(1,2,3) AND topic_id NOT IN (4,5) GROUP BY article_id;

Я не понимаю, почему вам нужно указать 6 и 7. Если вы не говорите, есть ли у него 6 или 7, другие правила не имеют значения.В этом случае вы можете сделать:

SELECT * FROM articles JOIN articleTopics USING(article_id) 
  WHERE (topic_id IN(1,2,3) AND topic_id NOT IN (4,5)) OR topic_id IN(6,7) GROUP BY article_id;
0 голосов
/ 12 ноября 2010

Вот что я закончил:

SELECT x.*
FROM Article x INNER JOIN
(SELECT t.article_id, COUNT(t.article_id)
  FROM articleTopics t
  WHERE t.topic_id IN ('1','2','3')
  AND NOT EXISTS (
       SELECT 1
       FROM articleTopics
       WHERE article_id = t.article_id
       AND entity_id IN ('4','5'))
  GROUP BY t.article_id
  HAVING COUNT(t.article_id)>=3
  ORDER BY COUNT(t.article_id) DESC
  LIMIT 0,100) AS ilv
ON x.id=ilv.article_id
LEFT JOIN articleTopics at ON at.article_id = x.id
WHERE ae_topic_id IN ('6','7')

Здесь говорится, что все статьи должны содержать все темы 1,2,3 и по крайней мере 1 из 6 или 7, но никогда не включать 4 или 5

Спасибо за вашу помощь в этом.

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

Я бы использовал функцию EXISTS, например:

SELECT ...
FROM Article a
WHERE EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 1)
  AND EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 2)
  AND EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 3)
  AND NOT EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 4)
  AND NOT EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 5)
  AND (EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 6)
    OR EXISTS (SELECT topic_id FROM articleTopics t WHERE t.article_id = a.article_id AND topic_id = 7))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...