查询是否满足所有条件

时间:2014-12-20 09:59:54

标签: mysql sql

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

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表以实现我的目标?

2 个答案:

答案 0 :(得分:1)

检查是否满足所有条件的简单方法是确定是否存在满足的任何条件。使用De Morgan's laws反转条件。您可以用简单的方式处理NULL - 为每个项目添加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更有效。

答案 1 :(得分:1)

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

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