Запрос Mysql для сравнения цен друг с другом на основе типа

#mysql #sql #laravel

#mysql #sql #laravel

Вопрос:

пример таблицы

 name   | source_data | price_a |
---------------------------------
name A | site_a      | 40.00   |
name A | site_b      | 50.00   |
name B | site_a      | 30.00   |
name B | site_b      | 20.00   |
  

Мой запрос в laravel

 $data = Product::select('product.device', DB::raw('a.price as price_a'), DB::raw('b.price as price_b'), 'product.date_created')
                ->leftJoin('product as a', function($leftJoin)
                {
                    $leftJoin->on('a.device', '=', 'product.device');
                    $leftJoin->on(DB::raw('a.source_data'), DB::raw('='),DB::raw("'site_a'"));


                })
                ->leftJoin('product as b', function($leftJoin)
                {
                    $leftJoin->on('b.device', '=', 'product.device');
                    $leftJoin->on(DB::raw('b.source_data'), DB::raw('='),DB::raw("'site_b'"));


                })->get();
  

Результаты, которые я хочу, это :

 name   |site_a_price | site_b_price |
---------------------------------
name A | 40.00       |  50.00       |
name B | 30.00       |  20.00       |
  

Я пытался использовать соединение по левому краю, но возвращал то же самое price_a и price_b для всех записей.

Ответ №1:

Вы можете попробовать использовать case, когда выражение

     select name,max(case when source_data='site_a' then price end ) as site_a_price,
    max(case when source_data='site_b' then price end ) as site_b_price
    from tablename
    group by name