数据库中的group by与rails中的group_by的区别及使用方法

来源:互联网 发布:不可抗力网络剧正片 编辑:程序博客网 时间:2024/05/16 04:35

group by是关系型数据库中较为常用的方法,rails也提供了类似的group_by方法,但两者还是有不小区别的,下面我们通过一个实例说明一下:

有一张表: orders,包含这些字段,用户ID: user_id商品ID: product_id购买数量: amount购买时间: buy_at

这里写图片描述

最后再次筛选出购买总数大于等于8的数据,那分组结果中的第一条数据又被去掉了,符合条件的只剩第二条了

如果用rails的find_by_sql来取数据:

@orders = Order.find_by_sql(["select user_id, sum(amount) from orders group by user_id"])此时如果看@orders.size的话,应该是2,只有两条数据

这个时候,我们再看一下rails提供的order_by方法:

@orders = Order.all.group_by{|o|o.user_id}此时我们得到的结果是这样的:{1=>[#<Order id: 1, user_id: 1, product_id: 1, amount: 3, buy_at: 2015-05-05>, #<Order id: 2, user_id: 1, product_id: 2, amount: 4, buy_at: 2015-05-05>], 2=>[#<Order id: 3, user_id: 2, product_id: 1, amount: 5, buy_at: 2015-05-05>,  #<Order id: 4, user_id: 2, product_id: 2, amount: 6, buy_at: 2015-05-06>]}

结果很明显,返回了一组Hash,key是user_id,value是等于这个user_id的所有实例对象,个人认为rails中的group_by,更符合“分组”这个词的本义,并没有去合并或者计算数据,而且根据要求进行了单纯的分组处理。我们拿第一条数据来看一下:

@orders.first1=>[#<Order id: 1, user_id: 1, product_id: 1, amount: 3, buy_at: 2015-05-05>, #<Order id: 2, user_id: 1, product_id: 2, amount: 4, buy_at: 2015-05-05>]@orders.first[0]3@orders.first[1] #<Order id: 2, user_id: 1, product_id: 2, amount: 4, buy_at: 2015-05-05>]此时又能对@orders.first[1]进行.each来迭代输出数据了

总结一下:两种group by,不存在好与坏,因为应用的场景不同,善于利用group by,在某些场景下可以大大减少对数据库的查询次数,提高页面的执行效率。

FROM:http://www.jianshu.com/p/5eb4c9353b00

0 0