首页 > 解决方案 > Laravel 根据投票显示前 5 个笑话

问题描述

我有一个关于 laravel 的问题

我想在 laravel 中通过投票显示前 5 个笑话。我有一张有笑话的桌子和一张有成绩的桌子。我想用一个笑话 id 获得平均成绩。然后显示前5个成绩。因此,相反,一个笑话可以有 5 和 7。这将是 6 级。

我尝试在互联网上查找,但不幸的是没有运气。我尝试了不同的方法,但我没有运气

$votes = DB::table('joke_votes')
            ->groupBy('jokes_id')
            ->selectRaw('jokes_id, avg(grade)')
            ->get();

我试过了,但没有用

我希望系统通过一个笑话找到所有的成绩。计算平均成绩并显示它的前 5 名。

这些是表格:

笑话投票: 在此处输入图像描述

笑话: 在此处输入图像描述

标签: phpmysqlsqllaravel

解决方案


我希望系统通过一个笑话找到所有的成绩。计算平均成绩并显示它的前 5 名。

假设您想根据 AVG 等级获取笑话,一般的 SQL 查询或多或少会像这样。

SELECT 
 jokes.*
FROM (
 SELECT 
    joke_votes.joke_id
  , AVG(joke_votes.grade) AS avg_grade
 FROM 
  joke_votes
 GROUP BY  
  joke_votes.joke_id

) AS joke_votes__avg_grade
INNER JOIN 
 jokes
ON
 joke_votes__avg_grade.joke_id = jokes.id
ORDER BY 
  joke_votes__avg_grade.avg_grade DESC
LIMIT 5

或者

SELECT 
 jokes.*
FROM (
 SELECT 
    joke_votes.joke_id
  , AVG(joke_votes.grade) AS avg_grade
 FROM 
  joke_votes
 GROUP BY  
  joke_votes.joke_id
 ORDER BY 
  joke_votes.avg_grade DESC
 LIMIT 5    
) AS joke_votes__avg_grade
INNER JOIN 
 jokes
ON
 joke_votes__avg_grade.joke_id = jokes.id
ORDER BY 
 joke_votes.avg_grade DESC

不要问我如何在 Laraval 中执行此操作,但很确定您可以在 Laraval 的连接中使用交付的表(子查询)。当我查看手册部分Sub-Query Joins


推荐阅读