Nếu user_id
là PRIMARY KEY thì bạn cần phải nâng cấp PostgreSQL; các phiên bản mới hơn sẽ xử lý nhóm chính xác theo khóa chính.
Nếu user_id
không phải là độc đáo cũng không khóa chính cho mối quan hệ 'bất động' trong câu hỏi, sau đó truy vấn này không có ý nghĩa nhiều, vì PostgreSQL không có cách nào để biết mà trị trả về cho mỗi cột của estates
trong đó nhiều hàng chia sẻ cùng một user_id
. Bạn phải sử dụng hàm tổng hợp thể hiện những gì bạn muốn, như min
, max
, avg
, string_agg
, array_agg
, v.v ... hoặc thêm (các) cột quan tâm vào GROUP BY
.
Hoặc bạn có thể thay đổi cụm từ truy vấn để sử dụng DISTINCT ON
và ORDER BY
nếu bạn thực sự muốn chọn một hàng tùy ý, mặc dù tôi thực sự nghi ngờ rằng có thể biểu thị thông qua ActiveRecord.
Một số cơ sở dữ liệu - bao gồm SQLite và MySQL - sẽ chỉ chọn một hàng tùy ý. Điều này được coi là không chính xác và không an toàn bởi nhóm PostgreSQL, vì vậy PostgreSQL tuân theo chuẩn SQL và coi các truy vấn đó là lỗi.
Nếu bạn có:
col1 col2
fred 42
bob 9
fred 44
fred 99
và bạn làm:
SELECT col1, col2 FROM mytable GROUP BY col1;
sau đó nó rõ ràng rằng bạn sẽ nhận được hàng:
bob 9
nhưng những gì về kết quả cho fred
? Không có câu trả lời đúng để chọn, vì vậy cơ sở dữ liệu sẽ từ chối thực hiện các truy vấn không an toàn như vậy. Nếu bạn muốn lớn nhấtcol2
cho bất kỳ col1
bạn muốn sử dụng max
tổng hợp:
SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;
Nguồn
2013-08-05 15:04:34
với GROUP BY trong PostgreSQL, bạn không thể sử dụng cột trong danh sách lựa chọn nếu bạn không sử dụng trong nhóm theo. Không biết làm thế nào để dịch nó thành đường ray –
Liên quan: http://stackoverflow.com/q/19601948/398670 –
Có thể trùng lặp: http://stackoverflow.com/questions/19601948/must-appear-in-the- chức năng nhóm-by-khoản-hoặc-được-sử dụng-in-an-tổng hợp- –