как избежать повторяющихся предложений в запросе MySQL

0

Мне нужно отфильтровать мою таблицу задач несколькими условиями.

select * from tasks where initialPrice > 20 where status = 3

Но если эти задачи относятся к userId = 1 (например) - мне нужно выбрать его с другими дополнительными статусами (со статусом = 1 и статусом = 5). Поэтому мой вариант:

select * from tasks where initialPrice > 20 and status = 3 or (status = 1 or status = 5 and userId = 5 and initialPrice > 20)

Можно ли избежать дублирования условий и как лучше всего построить этот запрос?

PS В дальнейшем этот запрос будет использоваться с несколькими объединениями, и будет трудно дублировать объединения и условия в обеих частях этого запроса.

Теги:
database

2 ответа

2
Лучший ответ

Попробуй это

select * from tasks 
where initialPrice > 20 
and case when status = 3 Then 1 when status in (1,5) and userId = 5 Then 1 else 0 end = 1
0

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

Итак, я бы предложил:

select t.*
from tasks t
where initialPrice > 20 and status = 3 and
      (userId <> 1 or status in (1, 5);

или же:

select t.*
from tasks t
where initialPrice > 20 and
      (user = 1 and status in (1, 3, 5) or
       user <> 1 and status = 3 
      )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню