[英]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.