使用AND,OR和NOT进行mysql查询

时间:2010-11-11 09:54:18

标签: mysql boolean boolean-logic

让我们说我有一个与主题有很多关系的文章表。分配给文章的每个主题都有一个type字段,其中包含3个值ANDNOTOR中的1个。

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 个答案:

答案 0 :(得分:1)

ALL和NOT部分非常简单,你只需用ANDs链接它们:

选择X来自Y哪一个和b和c而不是d和e而不是e。

OR之间介于:

从Y在哪里选择X((a AND b AND c)AND(d OR e或f))而不是g而不是h

用比较替换小数字,你就完成了。 因此,如果您想在代码中执行此操作,请对条件进行排序,然后将它们链接在一起作为String。小心避免SQL插入。

答案 1 :(得分:0)

如果我能正确理解

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

我假设'任何'你的意思是'任何一个'。您可以自己将文章加入主题,这是微不足道的。

答案 2 :(得分:0)

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'))