Laravel выберите уникальные товары по самой низкой цене из одной таблицы - PullRequest
2 голосов
/ 08 июля 2020

Добрый день, пытаюсь получить уникальные товары по самым низким ценам. У меня есть такая таблица продуктов: введите описание изображения здесь

Я хочу получить список товаров со всеми столбцами. Теперь есть некоторые продукты, которые имеют более одного поставщика, и в этом случае я хочу получить продукт с наименьшим cost_price.

Пока что я пробовал это

$products = DB::table('products')
        ->select('identifier')
        ->selectRaw('MIN(cost_price) as cost_price')
        ->where('stock', '>', 0)
        ->groupBy('identifier')
        ->orderBy('cost_price', 'asc')
        ->distinct()->get();

Этот запрос возвращает мне правильные результаты, но я не могу добавлять столбцы каждый раз, когда добавляю столбец, например stock в select, мне нужно добавить также в GroupBy, а затем я просто получаю все продукты.

Как это сделать? Спасибо за внимание.

1 Ответ

3 голосов
/ 08 июля 2020

Вам нужно greatest-n-per-group решение / подход для этой проблемы.

Запрос;

SELECT products.*
FROM products
         INNER JOIN (SELECT identifier, MIN(cost_price) AS minPrice
                     FROM products
                     WHERE stock > 0
                     GROUP BY identifier) AS sub
             ON sub.minPrice = products.cost_price and sub.identifier = products.identifier;

Версия построителя запросов;

$sub = DB::table('products')
    ->where('stock', '>', DB::raw(0))
    ->groupBy('identifier')
    ->select('identifier', DB::raw('min(cost_price) as minPrice'));

return DB::table('products')
    ->join(DB::raw('(' . $sub->toSql() . ') as sub'), function ($join) {
        $join->on('sub.minPrice', '=', 'products.cost_price');
        $join->on('sub.identifier', '=', 'products.identifier');
    })
    ->get(['products.*']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...