sql >> Base de Datos >  >> RDS >> Mysql

Rieles:extraiga y calcule datos de manera eficiente a través de varias relaciones

Para obtener una lista de ID de usuario con más de una compra, puede hacer lo siguiente, que accederá a una sola tabla:

user_ids = PurchasedDeal.count(:group => :user_id, :having => 'count_all > 0').keys

Posteriormente, puede obtener todos estos usuarios con:

users = User.find user_ids

Las cosas se pueden acelerar con un contador de caché. En su modelo de usuario, agregue la opción :counter_cache => true al has_many asociación para ofertas compradas. Necesitará una columna entera adicional en su tabla de usuarios e inicializar, que podría tener el siguiente aspecto en una migración:

add_column :users, :purchased_deals_count, :integer, :null => false, :default => 0
User.each { |u| User.reset_counters u, :purchased_deals }

Una vez que eso está fuera del camino, se vuelve mucho más simple:

users = User.all :conditions => 'purchased_deals_count > 0'

Rails mantendrá la columna actualizada por usted, con la mayoría de las operaciones estándar.

Obtener el precio total siempre implicará una unión. O puede crear un hash de precios de ofertas y realizar el tedioso procesamiento en Ruby. No soy un experto en SQL, pero potencialmente puede deshacerse de la unión almacenando el precio con el Acuerdo comprado. De lo contrario, aquí se explica cómo hacerlo con una unión:

user_id_to_price = PurchasedDeal.sum 'deal.price', :include => :deal, :group => :user_id

Puede filtrar eso solo por los usuarios que desee agregando algo como :conditions => ['user_id IN (?)', users] . (Donde users puede ser una lista de ID, pero también objetos de Usuario).