0

数据库结构
1:user用户表 id
2:user_attention用户收藏文章关联表 id,user_id,article_id
3:user_comment用户留言文章关联表 id,user_id,article_id,comment

要求:用户列表,查询文章收藏数,留言数,并且能够排序. 如果用laravel模型关联withCount就能得到数量,但没法根据数量排序。现在尝试用join联表查询,但attentions和comments结果总是一样,该怎么写得到正确结果?或者laravel能根据withCount结果排序吗

$list=User::leftjoin('user_attention as ua','ua.user_id','=','user.id')
->leftjoin('user_comment as uc','uc.user_id','=','user.id')
->selectRaw('user.id,user.name,user.img,count(ua.id) as attentions,count(uc.id) as comments')
->groupBy('user.id')
->paginate(10);
2019-07-30 提问
3 个回答
0

已采纳

orderByRaw(DB::count(uc.id)) 试试这个能不能根据count值排序呢,我没试验,记得大概这样用过。

1

你这没有假数据,没法测试,就只好根据描述简单写一下,不一定正确,没有运行过。
用框架的同时,不要拘谨与框架,最起码的原生还是要会写的,其次,正如其他答主所说,这种情况可以使用 Redis 或者 在 User 表做冗余统计,亦或者在着两个表上加一个累计量的字段,做冗余,方便应对于这种场景。

SELECT *
FROM 
    (SELECT user_id,
        count(user_comment.*) AS comment_count,
        count(user_attention.*) AS attention_count
    FROM user
    LEFT JOIN user_attention
        ON user.id = user_attention.user_id
    LEFT JOIN user_comment
        ON user_comment.user_id = user.id
    GROUP BY  user.id)
ORDER BY  comment_count;
0

建议可以做 冗余,数量用单独字段存起来,这样不管是排序,还是显示,查询都比较方便。

撰写答案

推广链接