【发布时间】:2021-03-29 13:30:33
【问题描述】:
我有表用户、用户特征和特征。我想知道的是,最简单、最有效的方式是显示以某种方式使用前 5 个特征排序的用户列表。(我正在使用 Laravel 8 和 SQL)
用户 : (id, name, .... ) user_traits : (id, user_id, trait_id, trait_order, trait_importance, ...) 特征 : (id, trait_name, trait_value, ....)
我正在寻找的结果类似于:(id, name, trait_name1, trait_value1, trait_name2, trait_value2, trait_name3, trait_value3, trait_name4, trait_value4, trait_name5, trait_value5);
当前代码:
$users = DB::table('users')->where(...)
->leftJoin('user_traits as trait1', function($join){
$join->on('trait1.user_id', '=', 'users.id')
->where('trait1.trait_order', 1);
}
)
->leftJoin('user_traits as trait2', function($join){
$join->on('trait2.user_id', '=', 'users.id')
->where('trait1.trait_order', 2);
}
).... up to 5
->leftJoin('traits as actualtrait1', function($join){
$join->on('actualtrait1.id', '=', 'trait1.trait_id');
}
)
->leftJoin('traits as actualtrait2', function($join){
$join->on('actualtrait2.id', '=', 'trait2.trait_id');
}
)....up to 5
欢迎任何帮助,并在此先感谢您。
【问题讨论】:
-
您遇到了什么错误?你的尝试有问题吗?
-
没有错误,只是执行时间非常慢。 (这只是更大查询的一部分,但我设法弄清楚这部分是整个查询的瓶颈)
-
看起来你正在做一个“pivot”并且框架正在阻碍。使用 case 表达式而不是一堆 Join。查看添加的标签。
标签: php mysql laravel performance pivot-table