在laravel中使用orderby-before-groupby

af7jpaap  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(390)

我有一个表,我想选择最低/最低价格的产品名称,如下所示:

product_name | price 
Cat          |   12
Dog          |   21
Cat          |   14
Dog          |   20
Fish         |   10
Fish         |    3

欲望输出应该是

Cat  | 12
Dog  | 20
Fish | 3

下面是我的sql查询

$products = DB::table('products')
            ->orderBy('products.products_price', 'asc')
            ->groupBy('products.products_name')
            ->get();

当我使用这个脚本时,它只显示最高/最高价格,而不是最低价格

eh57zj3b

eh57zj3b1#

你需要一个聚合而不是排序。对于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-minimum-value在一个字段中,同时选择mysql查询的不同行

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']);

这还没有经过测试,所以我希望它能起作用

nnsrf1az

nnsrf1az2#

问题:
您没有定义price属性应聚合到最小值。
解决方案:
如果想要最大价格,则需要选择min()聚合。你可以使用 ->selectRaw('MIN(price) as max_price') .
请注意:
如果您还想选择其他属性,只需添加逗号分隔的属性。 ->selectRaw('name, MAX(price) as max_price') @编辑
你还用奥德比吗?如果不是,请使用orderby('products.products\u price','asc')

相关问题