Странная проблема.
Мой запрос выглядит так
SELECT DISTINCT ID, `etcetc`, `if/elses over muliple joined tables` FROM
table1 AS `t1`
# some joins, eventually unrelated in that context
WHERE
# some standard where statements, they work/
CASE
WHEN `t1`.`field` = "foo" THEN (`t1`.`anOtherField` != 123 AND `t1`.`anOtherField` != 456 AND `t1`.`anOtherOtherField` != "some String")
WHEN `t1`.`field` = "bar" THEN `t1`.`aSecondOtherField` != 12345
END
#ORDER BY CASE etc. Standard Stuff
По-видимому, MySQL возвращает неправильное количество строк, и я думаю, что моя проблема заключается в логике оператора WHERE... CASE. Может со скобками? Может быть, мне стоит выбрать оператора OR
, а не AND
? Должен ли мой второй WHEN
также включать скобки, даже если я сравниваю только одно поле? Должен ли я использовать IF
, а не CASE
?
В основном я хочу исключить некоторые строки с определенными значениями, если в поле foo
или bar
есть определенное значение.
Я бы попробовал все это, но выполнение этого запроса занимает огромное количество времени... :(
Изменить: просто для заметок моя проблема заключалась в том, что я забыл ELSE
в своем CASE
.
CASE
WHEN `t1`.`field` = "foo" THEN (`t1`.`anOtherField` != 123 AND `t1`.`anOtherField` != 456 AND `t1`.`anOtherOtherField` != "some String")
WHEN `t1`.`field` = "bar" THEN (`t1`.`aSecondOtherField` != 12345)
ELSE TRUE
END
Это решение тоже работает, но опубликованное лучше...
t1
.field
может быть либо пустой строкой (в этом случае строка не должна возвращаться), либо какой-либо другой строкой, кроме 'foo' или 'bar' (в этом случае строка должна быть возвращенным (+ какое-то другое поле должно быть изменено, это сложный запрос)). Поэтому я изменил ваше решение, чтобы оно соответствовало моим потребностям. - person handfix   schedule 15.04.2010