sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL -musí se objevit v klauzuli GROUP BY nebo být použit v agregační funkci

Pokud user_id je PRIMÁRNÍ KLÍČ pak musíte upgradovat PostgreSQL; novější verze budou správně zpracovávat seskupování podle primárního klíče.

Pokud user_id není ani unikátní ani primární klíč pro daný vztah 'statky', pak tento dotaz nedává moc smysl, protože PostgreSQL nemá způsob, jak zjistit, který hodnotu, která se vrátí pro každý sloupec estates kde několik řádků sdílí stejné user_id . Musíte použít agregační funkci, která vyjadřuje, co chcete, například min , max , avg , string_agg , array_agg , atd. nebo přidejte požadovaný sloupec do GROUP BY .

Případně můžete dotaz přeformulovat tak, aby použil DISTINCT ON a ORDER BY pokud opravdu chcete vybrat poněkud libovolný řádek, i když opravdu pochybuji, že je možné to vyjádřit pomocí ActiveRecord.

Některé databáze – včetně SQLite a MySQL – vyberou pouze libovolný řádek. Tým PostgreSQL to považuje za nesprávné a nebezpečné, takže PostgreSQL se řídí standardem SQL a považuje takové dotazy za chyby.

Pokud máte:

col1    col2
fred    42
bob     9
fred    44
fred    99

a vy:

SELECT col1, col2 FROM mytable GROUP BY col1;

pak je zřejmé, že byste měli dostat řádek:

bob     9

ale co výsledek pro fred ? Neexistuje žádná jediná správná odpověď k výběru, takže databáze odmítne provést takové nebezpečné dotazy. Pokud jste chtěli největší col2 pro jakýkoli col1 použijete max agregát:

SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;


  1. Správa a monitorování databáze pro PostgreSQL 12

  2. MySQL find_in_set s více vyhledávacími řetězci

  3. Správa uživatelů MySQL

  4. Připravené příkazy MySQL