繁体   English   中英

在 Laravel 中的 GroupBy 之前使用 Orderby

[英]Using Orderby before GroupBy in Laravel

我有一张桌子,我想要 select 产品名称,最低/最低价格如下:

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

欲望 Output 应该是

Cat  | 12
Dog  | 20
Fish | 3

下面是我的 SQL 查询

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

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

您需要聚合而不是排序。 对于 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:在一个字段中按最小值分组,同时选择不同的行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']);

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

问题:

您没有定义应该将价格属性聚合到最低限度。


解决方案:

如果您想要最高价格,您需要 select MIN() 聚合。 您可以使用->selectRaw('MIN(price) as max_price')来做到这一点。


请注意:

如果您还想选择其他属性,只需添加它们以逗号分隔。

->selectRaw('name, MAX(price) as max_price')

@编辑

你还在使用 oderBy 吗? 如果没有,请尝试使用 orderBy('products.products_price', 'ASC')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM