Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel中使用GroupBy之前的Orderby_Php_Sql_Laravel_Eloquent - Fatal编程技术网

Php 在Laravel中使用GroupBy之前的Orderby

Php 在Laravel中使用GroupBy之前的Orderby,php,sql,laravel,eloquent,Php,Sql,Laravel,Eloquent,我有一个表,我想选择最低/最低价格的产品名称,如下所示: 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('produc

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

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();

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

问题:

您没有定义应该将price属性聚合到最小值


解决方案:

如果希望获得最高价格,则需要选择MIN()聚合。 您可以使用
->selectRaw('MIN(price)as max_price')
来实现这一点


请注意:

如果还希望选择其他属性,只需将它们以逗号分隔添加即可

->选择raw('name,MAX(price)作为MAX_price')

@编辑


你还在用奥德比吗?如果没有,请尝试使用orderBy('products.products\u price','ASC')

您需要的是聚合,而不是订购。对于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

这里的答案是: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']);

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

我还没有测试过这一点,但是仅仅改变排序的方向不应该达到您想要的效果吗<代码>订购人('products.products\u price','desc')?在查询中使用'desc'。。。看看会发生什么。我也使用了“desc”,但它不起作用。谢谢,但这并不能显示正确的产品“ID”。即如果Cat ID为1和3。最低/分钟的Cat为ID 1。因此,输出应为产品ID=1,产品名称=Cat,价格=12。您建议的SQL查询提供了正确的产品名称,但产品ID错误。i、 e它使用产品ID 3和最低价格,而使用产品ID 1和minAh,您没有提到产品ID。这增加了一个新的问题。非常抱歉。当我仔细观察我发现的输出时。请帮忙,我已经做了24小时了,我已经更新了我的答案。我希望有帮助。另外值得注意的是,Laravel现在有了一个可能也会有帮助的工具,谢谢,但这并没有带来正确的产品“ID”。即如果Cat ID为1和3。最低/分钟的Cat为ID 1。因此,输出应为产品ID=1,产品名称=Cat,价格=12。您建议的SQL查询提供了正确的产品名称,但产品ID错误。i、 e它使用产品ID 3和最低价格,而使用产品ID 1和最低价格。ye ID不正确,但您的question@LampSoft看我的编辑你还用orderBy吗?