SELECT t.id, t.active, t.off, t.duration, t.user
FROM table t
WHERE t.active = '0000-00-00 00:00:00'
OR t.duration != '0'
AND t.user = '1'
AND t.off = '0000-00-00 00:00:00'
LIMIT 0 , 30

В основном это игнорирование части t.off, что не так?

Спасибо =)

(запрос был отредактирован для примера, реальный запрос похож на этот, но с другими именами таблиц и т. д.)

== [Обновить] ==

SELECT t.active, t.off, t.duration, t.user
FROM table t
WHERE (
    t.active = '0000-00-00 00:00:00'
    OR t.duration != '0'
)
AND t.user = '1'
AND t.off = '0000-00-00 00:00:00'
LIMIT 0 , 30
UNION ALL
SELECT c.active, c.off, c.duration, c.user
FROM chair c
WHERE (
    c.active = '0000-00-00 00:00:00'
    OR c.duration != '0'
)
AND c.user = '1'
AND c.off = '0000-00-00 00:00:00'
0
Latox 22 Мар 2011 в 08:36

1 ответ

Вы должны использовать круглые скобки для группировки условий (and / or), чтобы убедиться, что они оцениваются в нужном вам порядке.

Например, вы хотите следующее:

SELECT t.id, t.active, t.off, t.duration, t.user
FROM table t
WHERE t.active = '0000-00-00 00:00:00'
OR (
    t.duration != '0'
    AND t.user = '1'
    AND t.off = '0000-00-00 00:00:00'
)
LIMIT 0 , 30

Или следующее:

SELECT t.id, t.active, t.off, t.duration, t.user
FROM table t
WHERE (
    t.active = '0000-00-00 00:00:00'
    OR t.duration != '0'
)
AND t.user = '1'
AND t.off = '0000-00-00 00:00:00'
LIMIT 0 , 30

А может еще что-то?


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

0
Pascal MARTIN 22 Мар 2011 в 08:38
К вашему сведению, MySQL интерпретирует это как первое. Короче говоря, без скобок или сгруппировать все и вокруг них: a and b or c and d and e => (a and b) or (c and d and e)
 – 
Nobody
22 Мар 2011 в 08:42
По сути, я хочу выбрать, где активно ничего ИЛИ продолжительность не равна 0, поэтому в основном активно = «0000-00-00 00:00:00» ИЛИ продолжительность = «1» - после этого я хочу выбрать их для пользователя X и мне нужны только результаты, где выключено также «0000-00-00 00:00:00». Это ваш второй ответ? Кажется, это работает. Пожалуйста подтвердите. Спасибо ! :)
 – 
Latox
22 Мар 2011 в 08:45
Если я правильно понимаю, что вы хотите, второй пример, который я разместил, должен быть тем, который вы ищете, да. @cwolves спасибо за разъяснение!
 – 
Pascal MARTIN
22 Мар 2011 в 08:47
Используя второй предоставленный вами код mySQL, он заставил исчезнуть результат, где активен = «0000-00-00 00:00:00», выключен = «0000-00-00 00:00:00» и продолжительность = «1» - это должно отображаться как продолжительность 1, как указано в ИЛИ?
 – 
Latox
22 Мар 2011 в 08:48
Ху... может пользователь не 1 ?
 – 
Pascal MARTIN
22 Мар 2011 в 08:51