【问题标题】:Query that checks if all conditions are met检查是否满足所有条件的查询
【发布时间】:2014-12-20 09:59:54
【问题描述】:

假设我有一个名为条件的示例表:

CREATE TABLE conditions (
  id int NOT NULL,
  age_from int,
  age_to int,
  height_from int,
  height_to int,
  PRIMARY KEY (id)
);

我插入了几个条件:

INSERT INTO conditions (age_from, age_to, height_from, height_to) 
VALUES (10, 14, NULL, 200);
INSERT INTO conditions (age_from, age_to, height_from, height_to) 
VALUES (NULL, NULL, 170, 250);

鉴于这些条件 年龄:11 岁且身高:180 的人符合标准,但年龄:15 岁且身高:169 的人不符合标准。

所以我的第一个想法是计算所有满足的条件并与条件的总数进行比较。 其中一些条件可以是NULL,这一事实使查询有点复杂。

这样的事情是行不通的,因为我必须检查具体条件是否为NOT NULL,然后进行比较,这会使查询变得相当复杂。

WHERE age_from <= 11 AND age_to >= 11 -- or using BETWEEN

是否有更优雅的方式来编写查询或重组conditions 表以实现我的目标?

【问题讨论】:

  • 哪个是关键字段?如果您正在寻找一种编写查询的优雅方式 - 首先在您的表中添加一个主键字段。
  • 你比较条件是什么?

标签: mysql sql


【解决方案1】:

检查是否满足所有条件的一种简单方法是找出是否有任何条件满足。使用De Morgan's laws 反转条件。您可以直接处理NULLs - 在每个项目中添加IS NULL,如下所示:

select count(*)
from conditions
where (age_from IS NOT NULL AND age < age_from)
  OR  (age_to IS NOT NULL AND age > age_to)
  OR  (height_from IS NOT NULL AND height < height_from)
  OR  (height_to IS NOT NULL AND height > height_to)

如果上述查询返回零,则所有条件都已满足。否则,查询返回未满足的条件数。

注意:如果您打算在WHERE 子句中使用此查询,使用NOT EXISTS 运算符将比使用COUNT 更有效。

【讨论】:

    【解决方案2】:

    首先在这里您在表中创建主键并使用下面的查询,例如请检查第一个数据库连接是否正确

    "Select * from tablename where `age_from` <= 11 and `age_to` >= 11";
    

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多