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吗?