Mysql
 sql >> база данни >  >> RDS >> Mysql

Rails - Ефективно извличане и изчисляване на данни в няколко релации

За да получите списък с потребителски идентификатори с повече от една покупка, можете да направите следното, което ще има достъп само до една таблица:

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

Впоследствие можете да извлечете всички тези потребители с:

users = User.find user_ids

Нещата могат да се ускорят с кеш брояч. Във вашия потребителски модел добавете опцията :counter_cache => true към has_many асоциация за закупени сделки. Ще ви е необходима допълнителна колона с цели числа в таблицата с потребители и инициализация, която може да изглежда по следния начин при мигриране:

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

След като това се премахне, става много по-просто:

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

Rails ще поддържа колоната актуална за вас, с повечето стандартни операции.

Получаването на общата цена винаги включва присъединяване. Или можете да създадете хеш от цените на сделката и да извършите досадната обработка в Ruby. Не съм експерт по SQL, но потенциално можете да се отървете от присъединяването, като съхраните цената с PurchasedDeal. В противен случай ето как да го направите с присъединяване:

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

Можете да филтрирате това само за потребителите, които искате, като добавите нещо като :conditions => ['user_id IN (?)', users] . (Къде users може да бъде списък с идентификатори, но също и потребителски обекти.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pandas - Обединяването на колони с низове не работи (бъг?)

  2. MySQL показва всички дефинирани от потребителя променливи

  3. codeigniter активен запис вложена заявка

  4. mysqli автоматично увеличава основния идентификатор, който е генериран

  5. Как мога да филтрирам символите на емоджи от моя вход, за да мога да запиша в MySQL <5.5?