sql >> Database >  >> RDS >> Mysql

Rails - Haal en bereken op efficiënte wijze gegevens over verschillende relaties

Om een ​​lijst met gebruikers-ID's bij meer dan één aankoop te krijgen, kunt u het volgende doen, waarmee u slechts één tabel kunt gebruiken:

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

Vervolgens kunt u al deze gebruikers ophalen met:

users = User.find user_ids

Dingen kunnen worden versneld met een counter-cache. Voeg in uw gebruikersmodel de optie toe :counter_cache => true naar de has_many vereniging voor koopovereenkomsten. U heeft een extra integer-kolom nodig in uw gebruikerstabel en initialiseert, wat er bij een migratie als volgt uit kan zien:

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

Als dat eenmaal uit de weg is, wordt het een stuk eenvoudiger:

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

Rails houdt de kolom voor u up-to-date, met de meeste standaard bewerkingen.

Om de totaalprijs te krijgen zal altijd een join nodig zijn. Of u kunt een hash van dealprijzen opbouwen en de vervelende verwerking in Ruby doen. Ik ben geen SQL-expert, maar je kunt de join mogelijk verwijderen door de prijs op te slaan bij de PurchasedDeal. Anders kun je het als volgt doen met een join:

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

Je zou dat kunnen filteren op alleen de gebruikers die je wilt door iets toe te voegen als :conditions => ['user_id IN (?)', users] . (Waar users kan een lijst met ID's zijn, maar ook gebruikersobjecten.)



  1. MySQL 5.7 retourneert alle kolommen van de tabel op basis van een afzonderlijke kolom

  2. Percentage berekenen binnen de SQL

  3. Een variabele gebruiken in OPENROWSET-query

  4. maak geformatteerde Excel-spreadsheet met MySQL-gegevens en PHP met behulp van tabellen