Laravel select 个价格最低的独特产品 table
Laravel select unique products with lowest price from one table
美好的一天,我正在尝试以最低的价格购买独特的产品。
我有这样的产品 table:
我想获得包含所有列的产品列表。现在有一些产品有多个供应商,那么我想拿最低的产品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();
这个查询 returns 我得到了正确的结果,但是每次我添加一列时我都无法添加更多的列,例如 stock
in select 我也需要在 GroupBy 和然后我就得到所有的产品。
怎么做?
感谢您的阅读。
你需要 greatest-n-per-group
solution/approach 来解决这个问题。
查询;
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.*']);
美好的一天,我正在尝试以最低的价格购买独特的产品。
我有这样的产品 table:
我想获得包含所有列的产品列表。现在有一些产品有多个供应商,那么我想拿最低的产品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();
这个查询 returns 我得到了正确的结果,但是每次我添加一列时我都无法添加更多的列,例如 stock
in select 我也需要在 GroupBy 和然后我就得到所有的产品。
怎么做? 感谢您的阅读。
你需要 greatest-n-per-group
solution/approach 来解决这个问题。
查询;
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.*']);