为了账号安全,请及时绑定邮箱和手机立即绑定

在 Laravel 中,在 GroupBy 之前使用 Orderby

在 Laravel 中,在 GroupBy 之前使用 Orderby

PHP
慕桂英3389331 2023-09-08 21:27:54
我有一个表,我想选择具有最低/最低价格的产品名称,如下:product_name | price Cat          |   12Dog          |   21Cat          |   14Dog          |   20Fish         |   10Fish         |    3期望输出应该是Cat  | 12Dog  | 20Fish | 3下面是我的 SQL 查询$products = DB::table('products')            ->orderBy('products.products_price', 'asc')            ->groupBy('products.products_name')            ->get();当我使用这个脚本时,它只显示最高/最大价格,而不是最低价格
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您需要聚合而不是排序。对于 Laravel,这意味着将列与 DB::raw 一起传递:


$products = DB::table('products')

        ->orderBy('products.products_price', 'asc')

        ->groupBy('products.products_name')

        ->select(['product_name', DB::raw('min(price) as price')])

        ->get();

编辑ID


在这里去掉答案:SQL: Group by mini-value in one field while select different rows the mysql query will be


SELECT p1.*     

FROM products p1 INNER JOIN

    (

        SELECT product_name, MIN(price) AS as min_price

        FROM products

        GROUP BY product_name

    ) p2 ON p1.product_name = p2.product_name AND p1.price = p2.min_price

现在我们必须将其转换为查询生成器


$products = DB::table('products AS p1')

   ->join(DB::raw('(

    SELECT product_name, MIN(price) AS as min_price

    FROM products

    GROUP BY product_name

) AS p2'), 

    function($join)

    {

       $join->on('p1.product_name', '=', 'p2.product_name');

       $join->on('p1.price', '=', 'p2.min_price');

    })

    ->get(['p1.id', 'p1.product_name', 'p1.price']);

这还没有经过测试,所以我希望它有效


查看完整回答
反对 回复 2023-09-08
  • 1 回答
  • 0 关注
  • 46 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信