返回表中每条记录的平均值

时间:2014-07-25 15:51:00

标签: php mysql sql laravel

我有一张表可以返回产品类别。他们是另一个表(称为inventory_review),其中包含客户留给产品的评论。我如何在实际类别的foreach循环中循环浏览每个评论以查找该特定产品的平均评级。

我可以在产品页面上轻松完成,只需在声明中使用AVG,但在类别上它只显示第一次评论。

Mysql的

     $category = Inventory::select('inventory_review.rating','inventory_images.image', 'inventory.id' , 'inventory.sku', 'inventory.name', 'inventory.price', 'inventory_categories.category')
        ->join('inventory_categories', 'inventory.sku', '=', 'inventory_categories.sku')
        ->leftJoin('inventory_images', 'inventory.sku', '=', 'inventory_images.sku')
        ->leftJoin('inventory_review', 'inventory.id', '=', 'inventory_review.inventory_id')
        ->where('inventory_categories.category', 'LIKE', '%'.$cat.'%')
        ->where('inventory.active', '=', 1)
        ->where('inventory.stock_quantity', '>', 2)
        ->groupby('inventory.id')
        ->paginate(16);

所以基本上会发生什么,它会遍历所有与该类别相匹配的产品,并且只返回产品的第一个评论评级。我知道我可能需要循环一些但不确定是什么。

@if($inventory->rating > 0)
    @for ($i=1; $i <= 5 ; $i++)
        @if($i <= $inventory->rating)
            <i class="fa fa-star"></i>
        @else
            <i class="fa fa-star-o"></i>
        @endif
    @endfor
@endif

2 个答案:

答案 0 :(得分:1)

您也应该在这里使用AVG()函数。 (不知道你正在使用的课程,但我会猜这样的事情)

$category = Inventory::select('AVG(inventory_review.rating) AS averageRating','inventory_images.image', 'inventory.id' , 'inventory.sku', 'inventory.name', 'inventory.price', 'inventory_categories.category')
        ->join('inventory_categories', 'inventory.sku', '=', 'inventory_categories.sku')
        ->leftJoin('inventory_images', 'inventory.sku', '=', 'inventory_images.sku')
        ->leftJoin('inventory_review', 'inventory.id', '=', 'inventory_review.inventory_id')
        ->where('inventory_categories.category', 'LIKE', '%'.$cat.'%')
        ->where('inventory.active', '=', 1)
        ->where('inventory.stock_quantity', '>', 2)
        ->groupby('inventory.id')
        ->paginate(16);

由于您最后使用的是GROUP BY,因此如果您未指定每项评论的评分(AVG(),MAX(),MIN()),则只会返回第一个评论评分,SUM()或你想要完成的事情。)

答案 1 :(得分:0)

接受Niklas的回答,但必须编辑它以适合Laravel文档

        $category = Inventory::select(DB::raw('AVG(inventory_review.rating) AS averageRating'),'inventory_images.image', 'inventory.id' , 'inventory.sku', 'inventory.name', 'inventory.price', 'inventory_categories.category')
            ->join('inventory_categories', 'inventory.sku', '=', 'inventory_categories.sku')
            ->leftJoin('inventory_images', 'inventory.sku', '=', 'inventory_images.sku')
            ->leftJoin('inventory_review', 'inventory.id', '=', 'inventory_review.inventory_id')
            ->where('inventory_categories.category', 'LIKE', '%'.$cat.'%')
            ->where('inventory.active', '=', 1)
            ->where('inventory.stock_quantity', '>', 2)
            ->groupby('inventory.id')
            ->paginate(16);