Se user_id
è la CHIAVE PRIMARIA quindi è necessario aggiornare PostgreSQL; le versioni più recenti gestiranno correttamente il raggruppamento in base alla chiave primaria.
Se user_id
non è né univoco né la chiave primaria per la relazione 'estates' in questione, quindi questa query non ha molto senso, poiché PostgreSQL non ha modo di sapere quale valore da restituire per ogni colonna di estates
dove più righe condividono lo stesso user_id
. Devi utilizzare una funzione aggregata che esprima ciò che desideri, ad esempio min
, max
, avg
, string_agg
, array_agg
, ecc. oppure aggiungi la/le colonna/e di interesse a GROUP BY
.
In alternativa puoi riformulare la query per utilizzare DISTINCT ON
e un ORDER BY
se vuoi davvero scegliere una riga alquanto arbitraria, anche se dubito davvero che sia possibile esprimerla tramite ActiveRecord.
Alcuni database, inclusi SQLite e MySQL, sceglieranno semplicemente una riga arbitraria. Questo è considerato non corretto e non sicuro dal team di PostgreSQL, quindi PostgreSQL segue lo standard SQL e considera tali query come errori.
Se hai:
col1 col2
fred 42
bob 9
fred 44
fred 99
e tu lo fai:
SELECT col1, col2 FROM mytable GROUP BY col1;
quindi è ovvio che dovresti ottenere la riga:
bob 9
ma per quanto riguarda il risultato per fred
? Non esiste un'unica risposta corretta da scegliere, quindi il database si rifiuterà di eseguire tali query non sicure. Se volevi il più grande col2
per qualsiasi col1
useresti il max
aggregato:
SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;