gpt4 book ai didi

mysql - Rails activerecord : sum, 最大值并加入

转载 作者:可可西里 更新时间:2023-11-01 07:27:29 25 4
gpt4 key购买 nike

我有两个模型usersposts。用户可以投票和查看帖子

#users
id
name

#posts
id
count_votes
count_views
users_id
created_at
updated_at

我想要在过去 24 小时内获得最多选票和帖子浏览量的用户。观看次数和票数最多的人获胜。

我尝试了什么我有这个 SQL 查询,它很好,但我想让用户获得最多的选票,这个查询给了我所有用户,但我不知道如何添加 count_views

select u.name as "Name", sum(p.count_votes)
from posts p
inner join users u on p.user_id = u.id
where p.created_at >= DATE_SUB(NOW(), INTERVAL 1 day)
group by user_id;

ActiveRecord 版本

Post.select("users.id, sum(posts.count_votes) as nb_votes")
.joins(:user).where("posts.created_at >= ?", 1.day.ago.beginning_of_day)
.group("posts.user_id")

# Results on IRB
=> #<ActiveRecord::Relation [#<Post id: 1>, #<Post id: 3>]>

我如何结合这两个总和的总和和最大值?有没有办法获得 activerecord 代码或只有原始 SQL?

最佳答案

您当前的查询对用户进行分组。因此,您将在输出中为每个用户获得一条记录。通过将输出限制为仅 1 条记录并按投票+观看总数排序,您可以获得排名靠前的用户。

原始 SQL:

select u.id, sum(p.count_votes + p.count_views) total
from posts p
inner join users u on p.user_id = u.id
where p.created_at >= DATE_SUB(NOW(), INTERVAL 1 day)
group by u.id
order by total DESC
limit 1 ;

ActiveRecord 版本:从您的用户模型开始,因此您将在输出中获得用户对象而不是 Post 对象,就像您在问题中提到的那样。

User.select("users.id, sum(posts.count_votes + posts.count_views) as nb_votes")
.joins(:post).where("posts.created_at >= ?", 1.day.ago.beginning_of_day)
.group("posts.user_id").order("nb_votes DESC").limit(1)

关于mysql - Rails activerecord : sum, 最大值并加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22440754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com