Mysql 如何在ActiveRecord查询中包含不属于group子句的字段?
(Ruby 1.9.3-p429;Rails 3.0.6) 我们对测试排队方式的最新更改已经呈现了我们的最后一个\u id范围:Mysql 如何在ActiveRecord查询中包含不属于group子句的字段?,mysql,ruby-on-rails,ruby,ruby-on-rails-3,Mysql,Ruby On Rails,Ruby,Ruby On Rails 3,(Ruby 1.9.3-p429;Rails 3.0.6) 我们对测试排队方式的最新更改已经呈现了我们的最后一个\u id范围: last_ids = tests.where('end_time != 0'). group(:condition1, :condition2, :condition3, :condition4). select('max(id) as id') 逻辑上过时了。以前,测试是按照与创建测试记录相同的顺
last_ids = tests.where('end_time != 0').
group(:condition1, :condition2, :condition3, :condition4).
select('max(id) as id')
逻辑上过时了。以前,测试是按照与创建测试记录相同的顺序排队和完成的,因此每个分组的最大id也是最新的测试记录。现在,为了提高效率,我们有一个排队算法,不再保证测试的顺序。我在测试表中添加了“结束时间”列。到目前为止,我的解决方案速度太慢,无法使用:
max_end_times = tests.where('end_time != 0').
group(:condition1, :condition2, :condition3, :condition4).
.maximum(:end_time)
它产生一个哈希:{[:condition0,:condition1,:condition2,:condition3]=>:endtime}。然后我做如下工作:
hash.each_pair do |key, value|
last_ids << tests.select(:id).
where(condition0: [key[0]]).
where(condition1: [key[1]]).
where(condition2: [key[2]]).
where(condition3: [key[3]]).
where(end_time: [value]).
map(&:id)[0]
end
hash.each_pair do|键、值|
最后一个IDActiveRecord::Calculations#Pull
编辑:如果您没有#pull
,您仍然可以在一个查询中执行此操作&a#map
:
tests.where('end_time != 0').
group(:condition1, :condition2, :condition3, :condition4).
select('id, max(created_at)').map(&:id)
我看到了Pull…不幸的是,我被困在rails 3.0.6上了。真糟糕。我刚刚看到现在也有一个#ids
方法,但我认为这在4.0中是新的。现在我想起来了,我不确定Pulk或它的前身是否会起作用。当我通过组和最大值时,id可能会丢失。嗯…关于:编辑(id,最大值(结束时间))?这真是奇怪的事情。我试过这个,结果是:{[21,“UNIT4”,“3930et”,“tengig”]=>2013-07-3105:53:21-0700,[2”,“3940”,“multi”]=>2013-08-0421:56:19-0700}(除其他外)。找不到身份证。这被证明是相当棘手的。是的,对不起,我想我并没有试图输出散列——你们可能想要的是where而不是group?老实说,我不确定这些条件在您的数据模型中应该做什么。所以您只需要每组4个条件中最新测试的ID?你需要把他们和小组配对吗?此外,如果列没有足够的精度,使用end\u time
可能不可靠,并且随着计算机速度的提高,问题会变得更严重。多个测试可能会在同一时间完成-在平局的情况下,您想要哪个id重要吗?