sql >> Database teknologi >  >> RDS >> PostgreSQL

Rails 3.1 med PostgreSQL:GROUP BY skal bruges i en aggregeret funktion

SQL'en genereret af udtrykket er ikke en gyldig forespørgsel. Du grupperer efter user_id og vælge en masse andre felter baseret på det, men ikke fortælle DB, hvordan den skal samle de andre filer. For eksempel, hvis dine data ser sådan ud:

a | b ---|--- 1 | 1 1 | 2 2 | 3

Når du nu beder db om at gruppere efter a og returnerer også b, den ved ikke, hvordan man aggregerer værdierne 1,2 . Du skal fortælle om den skal vælge min, max, gennemsnit, sum eller noget andet. Lige da jeg skrev svaret, har der været to svar, som måske forklarer alt dette bedre.

I dit tilfælde tror jeg dog, at du ikke vil have en gruppe på db-niveau. Da der kun er 10 kunster, kan du gruppere dem i din ansøgning. Brug dog ikke denne metode med tusindvis af kunst:

 arts = Art.all(:order => "created_at desc", :limit => 10)
 grouped_arts = arts.group_by {|art| art.user_id}
 # now you have a hash with following structure in grouped_arts
 # { 
 #    user_id1 => [art1, art4],
 #    user_id2 => [art3],
 #    user_id3 => [art5],
 #    ....
 # }
 

EDIT: Vælg nyeste_kunst, men kun én kunst pr. bruger

Bare for at give dig ideen om sql (har ikke testet det, da jeg ikke har RDBMS installeret på mit system)

SELECT arts.* FROM arts
WHERE (arts.user_id, arts.created_at) IN 
  (SELECT user_id, MAX(created_at) FROM arts
     GROUP BY user_id
     ORDER BY MAX(created_at) DESC
     LIMIT 10)
ORDER BY created_at DESC
LIMIT 10
 

Denne løsning er baseret på den praktiske antagelse, at ikke to kunster for samme bruger kan have samme højeste create_at, men det kan meget vel være forkert, hvis du importerer eller programmerer hovedparten af ​​kunst. Hvis antagelsen ikke holder stik, kan sql blive mere konstrueret.

EDIT: Forsøg på at ændre forespørgslen til Arel:

Art.where("(arts.user_id, arts.created_at) IN 
             (SELECT user_id, MAX(created_at) FROM arts
                GROUP BY user_id
                ORDER BY MAX(created_at) DESC
                LIMIT 10)").
    order("created_at DESC").
    page(params[:page]).
    per(params[:per])
 


  1. Tabellen kan ikke afkortes, fordi den refereres af en FOREIGN KEY-begrænsning - SQL Server / TSQL Selvstudium, del 70

  2. Kan jeg automatisk oprette en tabel i PostgreSQL fra en csv-fil med overskrifter?

  3. SQL LocalDB vs SQL Server CE

  4. Brug where in i spring-jdbc