Jen*_*sen 4 mysql sql laravel laravel-query-builder
我在 Laravel 中有这个查询:
DB::table('score')
->select('score.score_nl', DB::raw('count(*) as total'), DB::raw('round(avg(rating_results.rating)) as final_rating'))
->join('rating', 'rating.score_id', '=', 'score.id')
->join('rating_results', 'rating.rating_result_id', '=', 'rating_results.id')
->groupBy('score_nl')
->get();
Run Code Online (Sandbox Code Playgroud)
结果:
[{"score_nl":"emphatisch","total":1,"final_rating":"1"},{"score_nl":"huilen","total":2,"final_rating":"3"},{"score_nl":"knuffelig","total":1,"final_rating":"1"},{"score_nl":"zindelijkheid","total":2,"final_rating":"3"}]
Run Code Online (Sandbox Code Playgroud)
我rating_results在这个表中有一个名为(见图片)的表,我想查找final_rating并获取相关的result_en.
我怎么能在 Laravel 中做到这一点?
有任何问题请告诉我!
- 编辑 -
我试过这个;
$q = Result::select('result_nl')
->whereColumn('rating_results.rating', 'final_rating')
->whereColumn('rating_results.score_id', 'score_id')
->getQuery();
DB::table('score')
->select('score.score_nl', DB::raw('count(*) as total'), DB::raw('round(avg(rating_results.rating)) as final_rating'))
->join('rating', 'rating.score_id', '=', 'score.id')
->join('rating_results', 'rating.rating_result_id', '=', 'rating_results.id')
->selectSub($q, 'result_nl')
->groupBy('score_nl')
->get();
Run Code Online (Sandbox Code Playgroud)
但是后来我收到了这个错误:
SQLSTATE[42S22]: Column not found: 1247 Reference 'final_rating' not supported (reference to group function) (SQL: select `score`.`score_nl`, count(*) as total, round(avg(rating_results.rating)) as final_rating, (select `result_nl` from `rating_results` where `rating_results`.`rating` = `final_rating` and `rating_results`.`score_id` = `score_id`) as `result_nl` from `score` inner join `rating` on `rating`.`score_id` = `score`.`id` inner join `rating_results` on `rating`.`rating_result_id` = `rating_results`.`id` group by `score_nl`)
Run Code Online (Sandbox Code Playgroud)
看起来我需要使用joinSub
你很接近。你可以joinSub在这里使用。
从你的尝试中我可以看出,你还需要加入score_id?如果是这样,这是解决方案:
// Your initial query
$query = DB::table('score')
->selectRaw('
score.score_id,
score.score_nl,
count(*) as total,
round(avg(rating_results.rating)) as final_rating
')
->join('rating', 'rating.score_id', '=', 'score.id')
->join('rating_results', 'rating.rating_result_id', '=', 'rating_results.id')
->groupBy('score_nl');
// Now use joinSub (just like simple joins above)
$result = DB::table('rating_results')
->joinSub($query, 'subtable', function($join) {
$join->on('subtable.final_rating', '=', 'rating_results.rating')
->on('subtable.score_id', '=', 'rating_results.score_id');
})
->selectRaw('subtable.*, rating_results.result_en')
->get();
Run Code Online (Sandbox Code Playgroud)
但我个人会在这里使用原始 SQL。当查询变得过于繁琐时,避免 ORM 可能是一个好主意,这样您就不受其功能的限制:
$result = DB::select('
select subtable.*, rating_results.result_en
from rating_results
join (
select
score.score_nl,
count(*) as total,
round(avg(rating_results.rating)) as final_rating
from score
join rating on rating.score_id = score.id
join rating_results on rating.rating_result_id = rating_results.id
group by score_nl
) as subtable on subtable.final_rating = rating_results.rating
');
Run Code Online (Sandbox Code Playgroud)