column "users.name" must appear in the GROUP BY clause or be used in an aggregate function
Laravel app, just moved from MySQL to PostgreSQL. The full message as Laravel shows it:
Why it happens
MySQL (with ONLY_FULL_GROUP_BY off) lets you select columns that are not grouped and returns a value from an arbitrary row. Postgres refuses. Grouping by the table's primary key is allowed, so groupBy('users.id') with users.* works.
Fix
Worth knowing: the old MySQL query may have been returning the wrong row the whole time. In our test, select * ... group by user_id on non-strict MariaDB 11.8 returned the oldest row, not the latest.
The tested fix for every table at once (scripts, a Laravel command, before/after checks): Laravel Postgres Error Fix Pack ($19), item 03.
Several errors at once? Paste your log into the error matcher. Raw SQL with MySQL syntax: the free SQL translator. Not migrated yet: the free schema risk check finds this kind of problem before the switch. Planning the whole move: Migration Kit ($49, $34.30 with LAUNCH30 until Nov 5).
Other errors after MySQL to Postgres
duplicate key value violates unique constraint "users_pkey"value "3000000000" is out of range for type integeroperator does not exist: boolean = integeroperator does not exist: character varying = integerdate/time field value out of range: "0000-00-00 00:00:00"column "a@x.com" does not existsyntax error at or near "`"function ifnull(text, unknown) does not existinvalid byte sequence for encoding "UTF8": 0x00current transaction is aborted, commands ignored until end of transaction block(no error) search or login finds nothing: WHERE email LIKE ... returns 0 rows