как избежать повторяющихся предложений в запросе MySQL - PullRequest
0 голосов
/ 05 июля 2018

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

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)

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

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Использование выражений 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 
      )
0 голосов
/ 05 июля 2018

Попробуйте это

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...