gpt4 book ai didi

ruby-on-rails - 如何将两个不同 ActiveRecord 关系的 COUNT(*) 合并到一个 SQL 查询中?

转载 作者:行者123 更新时间:2023-12-03 08:57:14 24 4
gpt4 key购买 nike

对于两个不同的 ActiveRecord 关系对象,是否有一种方法可以发出一个 SQL 查询来比较关系的计数?

例如。假设我有两个 ActiveRecord::Relation 对象,如下所示:

posts = Post.where().where().some_scope
users = User.where().some_other_scope.where().joins(:something)

要比较每个关系的计数,我必须发出两个 SQL 查询。

posts.count == users.count
# => SELECT COUNT(*) FROM posts WHERE... ;
# => SELECT COUNT(*) FROM users INNER JOIN ... WHERE... ;

我希望能够只发出一个查询。像这样的东西:

Post.select("COUNT(first) == COUNT(second) as are_equal"), posts, users).are_equal

最佳答案

除非您使用UNION,否则不可能将两个不同表的两个计数合并到一个查询中。这将运行两个单独的查询并合并结果。这与分别运行两个查询大约需要相同的时间,除非您只访问数据库服务器一次(1 个查询),但会失去可读性。所以恕我直言,我真的想知道这是否值得。

例如在一种情况下你可以写

 if posts.count == users.count 

在另一种情况下,人们会写:

 count_sql = <<-SQL 
select "Posts" as count_type, count(*) from posts where ...
union
select "Users" as count_type, count(*) from users where ...
SQL

result = Post.connection.execute(count_sql)
if result[0]["count"] == result[1]["count"]

您必须决定性能改进是否会导致可读性的损失。

关于ruby-on-rails - 如何将两个不同 ActiveRecord 关系的 COUNT(*) 合并到一个 SQL 查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312293/

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