Jeśli user_id
to KLUCZ PODSTAWOWY musisz zaktualizować PostgreSQL; nowsze wersje poprawnie obsłużą grupowanie według klucza podstawowego.
Jeśli user_id
nie jest ani unikalny ani kluczem podstawowym dla danej relacji „posiadłości”, to zapytanie nie ma większego sensu, ponieważ PostgreSQL nie ma sposobu, aby dowiedzieć się, który wartość do zwrócenia dla każdej kolumny estates
gdzie wiele wierszy ma ten sam user_id
. Musisz użyć funkcji agregującej, która wyraża to, czego chcesz, np. min
, max
, avg
, string_agg
, array_agg
, itp. lub dodaj interesujące kolumny do GROUP BY
.
Alternatywnie możesz przeformułować zapytanie, aby użyć DISTINCT ON
oraz ORDER BY
jeśli naprawdę chcesz wybrać nieco arbitralny wiersz, chociaż naprawdę wątpię, czy można to wyrazić za pomocą ActiveRecord.
Niektóre bazy danych — w tym SQLite i MySQL — po prostu wybierają dowolny wiersz. Jest to uważane za nieprawidłowe i niebezpieczne przez zespół PostgreSQL, więc PostgreSQL stosuje się do standardu SQL i uważa takie zapytania za błędy.
Jeśli masz:
col1 col2
fred 42
bob 9
fred 44
fred 99
a ty robisz:
SELECT col1, col2 FROM mytable GROUP BY col1;
wtedy oczywiste jest, że powinieneś otrzymać wiersz:
bob 9
ale co z wynikiem dla fred
? Nie ma jednej poprawnej odpowiedzi do wybrania, więc baza danych odmówi wykonania takich niebezpiecznych zapytań. Jeśli chciałeś najwspanialszego col2
dla każdego col1
użyjesz max
agregat:
SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;