Предложение Mysql where для нескольких полей, одно из которых может быть нулевым

#php #mysql #laravel #eloquent

#php #mysql #laravel #красноречивый

Вопрос:

В моей таблице продуктов у меня есть 2 столбца: price и discounted_price , в котором discounted_price значение null большую часть времени, если для этого продукта нет рекламы:

  ---- -------------------- ------- ------------------ 
| id | name               | price | discounted_price |
 ---- -------------------- ------- ------------------ 
|  1 | test 1             | 79.00 |       null       |
|  2 | test 2             | 50.00 |       45.00      |
 ---- -------------------- ------- ------------------ 
  

Продукт с идентификатором 2 сейчас находится в продвижении и имеет discounted_price .
Теперь я хочу запросить продукты, чтобы получить продукты дешевле 50, но в моем запросе мне нужно проверить, discounted_price есть null ли это, затем заглянуть price , в противном случае заглянуть discounted_price . То, что сказал Google, использует:

 $products = Product::where('coalesce(price, discounted_price) <= 50);
  

Но это не работает:(

Комментарии:

1. если вам нужно получить дешевле 50 и null также, тогда подзапроса недостаточно?

2. В вашем примере вы не закрываете строку, ' отсутствует в конце после 50

3. @Pepper это просто опечатка здесь

Ответ №1:

Альтернативно, вы можете использовать подзапрос, например, так :

 $q = 50;
$product = Product::where(function($query) use($q) {
      $query->where('discounted_price', '<=', $q)
            ->orWhere('price', '<=', $q)
   })
   ->get();
  

Комментарии:

1. Я принял ваш ответ, потому что он работает, но все же я не знаю, почему select * from products where coalesce(price, discounted_price) <= 50 не работает

Ответ №2:

вы можете использовать whereRaw вместо where или where(DB::raw('coalesce(price, discounted_price') <= 50))

также будьте осторожны, чтобы закрыть свой where по ' символу

Ответ №3:

я рекомендую использовать where с clouser следующим образом:

  $products = Product::where(function ($query)
        {
            $query->where('discounted_price',null)->where('price','<=',50);
        })->orWhere('discounted_price','<=',50)->get();
  

Комментарии:

1. Как насчет OrderBy?