我有一个数组的结果,我得到从SQL使用ActiveRecord::Base.connection.execute
命令。(我不能使用ActiveRecord查询像Object.where()
,因为表没有相应的模型)
我得到一个数组:
2800 1.7 1
2000 4.5 0
2107 3.0 0
2107 5.6 1
3435 2.3 0
3425 0.0 0
3425 1.3 0
1980 2.0 0
现在我想按第三列的值对这个2D数组进行排序,以便所有在第三列中值为1的行移到底部,但希望保持所有在第一列中具有相同值的行在一起。
排序后的数组应该是这样的:
2000 4.5 0
3435 2.3 0
3425 0.0 0
3425 1.3 0
1980 2.0 0
2800 1.7 1
2107 3.0 0
2107 5.6 1
现在我知道这可以通过在第3列上使用和查询或在数组上使用sort_by
方法来完成,但我无法制定正确的查询。
Via SQL:
( SELECT t.* FROM mytable t
LEFT JOIN mytable tt ON t.a = tt.a AND tt.c = 1
WHERE tt.a IS NULL)
UNION
( SELECT t.* FROM mytable t
JOIN mytable tt ON t.a = tt.a AND tt.c = 1
ORDER by t.c, t.a
)
在这里,我将查询拆分为2部分:第二部分搜索所有第三列为1的记录,并在第一列搜索所有相邻的记录,即
> (select t.* from mytable t join mytable tt ON t.a = tt.a AND tt.c = 1 ORDER by t.c, t.a);
+------+------+------+
| a | b | c |
+------+------+------+
| 2107 | 3 | 0 |
| 2107 | 6 | 1 |
| 2800 | 2 | 1 |
+------+------+------+
3 rows in set (0.00 sec)
第一部分只是否定它,即搜索其他所有内容。之后,我只是通过UNION
条款将它们按正确的顺序排列。
似乎工作良好:
mysql> (select t.* from mytable t left join mytable tt ON t.a = tt.a AND tt.c = 1 WHERE tt.a IS NULL) UNION (select t.* from mytable t join mytable tt ON t.a = tt.a AND tt.c = 1 ORDER by t.c, t.a);
+------+------+------+
| a | b | c |
+------+------+------+
| 2000 | 5 | 0 |
| 3435 | 2 | 0 |
| 3425 | 0 | 0 |
| 3425 | 1 | 0 |
| 1980 | 2 | 0 |
| 2800 | 2 | 1 |
| 2107 | 3 | 0 |
| 2107 | 6 | 1 |
+------+------+------+
8 rows in set (0.00 sec)
您可以尝试使用以下代码在ruby中处理它
array = [[2800 , 1.7, 1],[2000 , 4.5, 0],[2107 , 3.0, 0],[2107 , 5.6, 1],[3435 , 2.3, 0],[3425 , 0.0, 0],[3425 , 1.3, 0],[1980 , 2.0, 0]]
array.sort_by {|a| a[2]}
# => [[1980, 2.0, 0], [2000, 4.5, 0], [2107, 3.0, 0], [3425, 1.3, 0], [3425, 0.0, 0], [3435, 2.3, 0], [2107, 5.6, 1], [2800, 1.7, 1]]