【问题标题】:mysql query with AND, OR and NOT带有 AND、OR 和 NOT 的 mysql 查询
【发布时间】:2011-05-08 09:03:27
【问题描述】:

假设我有一个文章表,其中包含与主题的多对多关系。分配给文章的每个主题都有一个 type 字段,可以包含 ANDNOTOR 三个值中的一个。

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)

如何创建此查询?

提前致谢!

【问题讨论】:

  • 工作不行,我有12年没做作业了!
  • ArticleTopics (article_id, topic_id) 上是否有唯一索引? type 列背后的确切含义是什么?为什么要使用“NOT”类型,而不是简单地在 ArticleTopics 表中没有条目?
  • 另外,对于要包含在结果中的文章,是否需要与第二个约束中的所有 3 个主题(4,5 和 6)进行 OR 关联,或者是否需要与只有一个?

标签: mysql boolean boolean-logic


【解决方案1】:

ALL 和 NOT 部分非常简单,只需用 AND 将它们链接起来:

从 Y 中选择 X,其中 a AND b AND c AND NOT d AND e AND NOT e.

OR 介于:

从 Y 中选择 X WHERE ((a AND b AND c) AND (d OR e OR f)) AND NOT g AND NOT h

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

【讨论】:

  • 字段在关系之上,所以没有这么简单。
【解决方案2】:

如果我理解正确

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

我假设“任何”是指“任何一个”。您可以自己将文章加入主题,这很简单。

【讨论】:

    【解决方案3】:
    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'))
    

    【讨论】:

    • 请注意,您可以通过缩进四个空格将行格式化为代码。编辑器工具栏中的“101\n010”按钮为您完成此操作。单击编辑器工具栏中的橙色问号以获取有关格式设置的更多信息和提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多