查找其平均值与其他ID

时间:2018-02-03 13:59:47

标签: mysql laravel eloquent

我有一个名为“Rating”的MySQL表,其中包含(id,rateable_id,rating,user_id)列。 rateable_id是评级的记录的id,评级的评分存储在评级(星级评分)中。

我想要做的就是找到特定的rateable_id(分组),其sum和其他rateable_id之和最大。

在上面的示例表中,我应该得到rateable_id = 26,因为与其他rateable_id相比,它的评级为max((3 + 3)/ 2)= 3。 原始的sql或eloquent任何首选。

编辑很抱歉提及但我已经粗略地做了非标准方式
无论如何它返回答案但我正在寻找使用嵌套的选择答案。 averageRating是用于计算平均等级的willvincent包。 $ popular_post返回平均评级总和最大的id。

$posts =  "App\Opportunity"::all(); //where(createdate < 1month)        
        $i=11;
        $cr=0;
        $pr=0;
        $mi = 0; //max index    
        $maxR=0; //max rating value 
        for($i=0; $i< count($posts); $i++)  
        {
            $cr = $posts[$i]->averageRating; //current rating   
            if($cr)<br> 
            {
                if($cr > $maxR) 
                {
                    $maxR = $cr;    
                    $mi = $i;   

                }               
            }
            else
            {
           //     echo "skip<br>";
            }                                   
        }

        $popular_post = ($posts[$mi]->id);

2 个答案:

答案 0 :(得分:1)

您将需要2个选择:

SELECT MAX(rating) rating, rateable_id FROM (
    SELECT AVG(rating) rating, rateable_id FROM table GROUP BY reateble_id
) GROUP BY rateable_id ORDER BY rating LIMIT 1

答案 1 :(得分:0)

我认为这对你有所帮助。

$ratings = Rating::all()->groupBy('rateable_id');

$topList = [];

foreach($ratings as $key => $value){
    $topList[$key] = ($value->sum('rating')) / count($value);
}

arsort($topList);                          //sort the array by top values
$max_rateable_id = key($topList);          //key of first item of the array
$max_rating = reset($topList);             //value of first item of the array
$both = [$max_rateable_id => $max_rating]; //key and value of the first item of the array