Запрос MySQL, ГДЕ включая CASE или IF?

Странная проблема.

Мой запрос выглядит так

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

Это решение тоже работает, но опубликованное лучше...


person handfix    schedule 15.04.2010    source источник
comment
Это не то же самое, что решение ниже. ELSE TRUE -> OR (t1.field не в ('foo', 'bar'))   -  person newtover    schedule 15.04.2010
comment
Да, я знаю. Я забыл упомянуть, что t1.field может быть либо пустой строкой (в этом случае строка не должна возвращаться), либо какой-либо другой строкой, кроме 'foo' или 'bar' (в этом случае строка должна быть возвращенным (+ какое-то другое поле должно быть изменено, это сложный запрос)). Поэтому я изменил ваше решение, чтобы оно соответствовало моим потребностям.   -  person handfix    schedule 15.04.2010


Ответы (1)


Вы должны использовать ИЛИ здесь вместо CASE:

WHERE
(`t1`.`field` = "foo" AND `t1`.`anOtherField` != 123 AND `t1`.`anOtherField` != 456 AND `t1`.`anOtherOtherField` != "some String")
OR
(`t1`.`field` = "bar" AND `t1`.`aSecondOtherField` != 12345)
person newtover    schedule 15.04.2010
comment
О боже, ты прав, я такой придурок. Ха-ха. Я явно перестарался с этим, я был уверен, что это просто не может быть НАСТОЛЬКО простым, и поэтому даже не думал об этом решении полностью. Может быть, когда вы пишете запрос длиной в страницу. - person handfix; 15.04.2010