sql >> Database teknologi >  >> RDS >> Mysql

Skinner - Træk og beregner effektivt data på tværs af flere relationer

For at få en liste over bruger-id'er med mere end ét køb kan du gøre følgende, som kun vil få adgang til én tabel:

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

Efterfølgende kan du hente alle disse brugere med:

users = User.find user_ids

Tingene kan fremskyndes med en tællercache. Tilføj muligheden :counter_cache => true i din brugermodel til has_many forening for købte handler. Du skal bruge en ekstra heltalskolonne på din brugertabel og initialisere, som kan se ud som følger i en migrering:

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

Når det er af vejen, bliver det meget enklere:

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

Rails vil holde kolonnen opdateret for dig med de fleste standardoperationer.

For at få den samlede pris vil det altid indebære en joinforbindelse. Eller du kan bygge en hash af aftalepriser og lave den kedelige behandling i Ruby. Jeg er ingen SQL-ekspert, men du kan potentielt slippe af med joinforbindelsen ved at gemme prisen med PurchasedDeal. Ellers gør du sådan her med et join:

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

Du kan filtrere det på netop de brugere, du ønsker, ved at tilføje noget såsom :conditions => ['user_id IN (?)', users] . (Hvor users kan være en liste over ID'er, men også brugerobjekter.)



  1. Sammenligning af SQL, forespørgselsbyggere og ORM'er

  2. Få resultater fra mine egne og venners indlæg

  3. ACL-fejl ved forsøg på at sende mail via Oracle UTL_SMTP

  4. PostgreSQL-procesnavne på Solaris