我有一个包含articles
的表和两个数据透视表views
和votes
,用于包含article_id
和user_id
列的文章。对于文章,我有一个列publish
,我检查文章是否已发布。我需要按受欢迎程度进行查询,其中我从两个数据透视表中获取所有已发布的文章,其中每个投票都来自表votes
counts
作为3
,并且每个计数从表views
counts
作为1
。不知道如何做到这一点,我以前有一个查询,我在那里发表了他们只有票数的发表文章,但我只得到了一些投票的文章,而不是那些已经发表但没有投票的文章。在新的查询中,我还需要添加视图,并更改计数的逻辑,包括发布的文章而不是视图,并按照这两个数据透视表中的计数对它们进行排序。
所以,想要的输出会是这样的:
[{"id":117,"popularityCount":17},{"id":118,"popularityCount":15},{"id":121,"popularityCount":13}]
这是查询,但这不再是我需要的了:
$articles = DB::table('articles')
->select([DB::raw('articles.id'), DB::raw('COUNT(*) as "votes"')])
->join('votes', 'article_id', '=', 'articles.id')
->where('articles.publish', 1)
->groupBy('votes.article_id')
->orderBy('votes', 'desc')
->get();
return $articles;
答案 0 :(得分:0)
如果将来有人需要它,这对我最终有用了!
$result = Article::select('articles.*', 'v.vote_count', 'vw.view_count')
->where('publish', 1)
->leftJoin(DB::raw('(SELECT votes.article_id, COUNT(*) AS vote_count FROM votes GROUP BY votes.article_id) v'), 'v.article_id', '=', 'articles.id')
->leftJoin(DB::raw('(SELECT views.article_id, COUNT(*) AS view_count FROM views GROUP BY views.article_id) vw'), 'vw.article_id', '=', 'articles.id')
->orderByRaw('(v.vote_count * 3) + vw.view_count DESC')
->where('created_at', '>', $date->format('Y-m-d') . ' 00:00:00')
->get();