2014-12-20 4 views
2

Допустим, у меня есть пример таблицы называются условиями:запрос, который проверяет, если соблюдены все условия

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 для достижения своей цели?

+0

Что является ключевым полем? Если вы ищете элегантный способ написания запроса, сначала добавьте в таблицу поля первичного ключа. –

+0

Вы сравниваете условия * с *? –

ответ

1

Простой способ проверить, соблюдены ли все условия, чтобы узнать, есть ли какие-либо условия, которые являются не met. Используйте 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

В первом здесь вы создаете первичный ключ в таблице и ниже использовать запрос как Пожалуйста, вы проверяете первое соединение с базой данных правильно или нет

"Select * from tablename where `age_from` <= 11 and `age_to` >= 11"; 
Смежные вопросы