2017-01-20 2 views
1

Следующий запрос работает, как ожидалось, и не возвращает данные с «с» флагом:SQL Оператор Select не работает с «как», как и ожидалось

SELECT * 
FROM `func` 
WHERE `next_act` < 1484870400 
AND `assigned_to` IS NULL 
AND `type` like '%FTTC%' 
AND (`flags` NOT LIKE '%c%' OR `flags` IS NULL) 
ORDER BY `priority`, `kci3_date`, `kci3_time` ASC 
LIMIT 1 

Когда я добавить дополнительный «не нравится», это начинается возвращать данные с «с» в flags

SELECT * 
FROM `func` 
WHERE `next_act` < 1484870400 
AND `assigned_to` IS NULL 
AND `type` like '%FTCT%' 
AND (`flags` NOT LIKE '%c%' OR `flags` NOT LIKE 'w' OR `flags` IS NULL) 
ORDER BY `priority`, `date`, `time` ASC 
LIMIT 1 
+1

Ну, 'флаги НЕ НРАВИТСЯ 'w' 'позволяет' flags' быть * любым *, но '' w'' и 'null' (' 'c'' включено) –

+2

Я думаю, вы должны использовать AND not OR – Jens

+0

write 'AND ((' 'flags \' NOT LIKE '% c%' AND \ 'flags \' NOT L IKE 'w') ИЛИ \ 'flags \' IS NULL) 'вместо – fafl

ответ

0

Вы использовали OR с микросхемой не нравится.

SELECT * 
FROM `func` 
WHERE `next_act` < 1484870400 
AND `assigned_to` IS NULL 
AND `type` like '%FTCT%' 
AND ((`flags` NOT LIKE '%c%' 
     AND `flags` NOT LIKE 'w') -- Should this be '%w%' ? 
    OR `flags` IS NULL) 
ORDER BY `priority`, `date`, `time` ASC 
LIMIT 1 

Вы также можете использовать:

SELECT * 
FROM `func` 
WHERE `next_act` < 1484870400 
AND `assigned_to` IS NULL 
AND `type` like '%FTCT%' 
AND (NOT (`flags` LIKE '%c%' 
     OR `flags` LIKE 'w') -- Should this be '%w%' ? 
     OR `flags` IS NULL) 
ORDER BY `priority`, `date`, `time` ASC 
LIMIT 1 

говоря (не так, как 'ххх' или не нравится 'YYY') означает, что 'ххх', на самом деле, а не как 'YYY', так он вернет значение.

+0

Спасибо за помощь - все работает при переключении на «AND» вместо «OR» – djd

0

Вы должны комбинировать условия с AND, а не с OR. Согласно вашему комментарию

Я хочу, чтобы показать какой-либо другой, чем с, W или NULL флаги

вы хотите что-то вроде этого:

SELECT * 
    FROM `func` 
    WHERE `next_act` < 1484870400 
    AND `assigned_to` IS NULL 
    AND `type` like '%FTCT%' 
    AND (`flags` <> 'c' AND 
      `flags` <> 'w' AND 
      `flags` IS NOT NULL) 
ORDER BY `priority`, 
     `date`, 
     `time` ASC 
    LIMIT 1 

Пожалуйста, заметьте NOT в flags IS NOT NULL и flags <> 'w' isntead LIKE .... Вы можете комбинировать оба <> в один NOT IN:

 ... 
    WHERE `next_act` < 1484870400 
    AND `assigned_to` IS NULL 
    AND `type` like '%FTCT%' 
    AND (`flags` NOT IN ('c', 'w') AND 
      `flags` IS NOT NULL) 
    ... 
0

Она возвращает данные с «с», потому что вы используете или оператор

`flags` NOT LIKE '%c%' OR `flags` NOT LIKE 'w` 

Он будет проверять как это условие и возврата строки, пожалуйста, поправьте ваш запрос

Смежные вопросы