Laravel 从一张表中选择价格最低的独特产品

Posted

技术标签:

【中文标题】Laravel 从一张表中选择价格最低的独特产品【英文标题】:Laravel select unique products with lowest price from one table 【发布时间】:2020-10-29 06:28:45 【问题描述】:

美好的一天,我正在努力以最低的价格获得独特的产品。 我有一个这样的产品表:

我想获取包含所有列的产品列表。现在有些产品有多个供应商,这种情况下我想抢最低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 在选择中我需要在 GroupBy 中添加,然后我只是得到所有产品。

怎么做? 感谢您的阅读。

【问题讨论】:

【参考方案1】:

你需要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.*']);

【讨论】:

非常感谢 Ersoy,您的解决方案是正确的,非常有帮助。

以上是关于Laravel 从一张表中选择价格最低的独特产品的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中的多行插入查询(从一张表中选择多行并插入到另一张表中[重复]

从一张表中选择金额

MySQL:仅当不在另一张表中时才从一张表中选择电子邮件?

从一张表中选择不同的值并限制它们

SQL 查询只从一张表中拉取数据

sql语句 怎么从一张表中查询数据插入到另一张表中