복붙노트

[RUBY-ON-RAILS] GroupingError : 오류 : 열이 GROUP BY 절에 나타나야합니다 또는 집계 함수에 사용

RUBY-ON-RAILS

GroupingError : 오류 : 열이 GROUP BY 절에 나타나야합니다 또는 집계 함수에 사용

나는 (A has_many 리뷰 관계를 통해 가장 높은 평가 앨범을 표시하는 방법이 솔루션에서 사용되는 코드)를 가장 높은 평균 심사 평가로 앨범 순위 내 컨트롤러 코드가 있습니다 :

@albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group("albums.id").order("average_rating DESC")

내가 Heroku가에 코드를 밀어 나는이 오류가 발생했습니다 PostgreSQL을 할 때이 코드는하지만, 내 개발 환경 (sqlite3를)에서 완벽하게 작동합니다 :

PG::GroupingError: ERROR:  column "reviews.id" must appear in the GROUP BY clause or be used in an aggregate function

나는 조금 나는 그것이 모두 내 개발 및 생산 환경에서 작동하도록 코드를 리팩토링하는 데 문제가 있어요 그래서 SQL과 미숙 한 오전, 이것은 매우 일반적인 문제입니다 알고 있습니다.

해결법

  1. ==============================

    1.당신은 평균과 같은 집계 함수를 GROUP BY 절에 추가하거나 적용하지 않고 (와일드 카드 *를 통해 암시 적으로 선택) reviews.id을 선택 할 수 없습니다 (). 이 솔루션은 다음 중 하나를 수행하는 것입니다 :

    당신은 평균과 같은 집계 함수를 GROUP BY 절에 추가하거나 적용하지 않고 (와일드 카드 *를 통해 암시 적으로 선택) reviews.id을 선택 할 수 없습니다 (). 이 솔루션은 다음 중 하나를 수행하는 것입니다 :

    두 번째와 세 번째 옵션은하지만 당신의 시나리오에서 많은 이해가되지 않습니다. 귀하의 의견을 바탕으로, 나는 옵션 네 가지를 추가했다.

  2. ==============================

    2.다만 활성 레코드 (시나)를 사용하여 루비에이 코드를 공유하고 싶습니다

    다만 활성 레코드 (시나)를 사용하여 루비에이 코드를 공유하고 싶습니다

    나는 코드의 라인 때문에, 기능 "에 의해 순서"는에 "그룹화"를 추가했다 ...

    에서:

    @models = Port.all.order('number asc')
    

    에:

    @models = Port.select(:id, :device_id, :number, :value, :sensor, :UOM).all.order('number asc').group(:id,:sensor,:UOM)
    

    그리고 그렇지 않으면이 오류가 발생합니다, 다만이 경우 "Port.id"그룹 절에 추가해야합니다에서 ID 필드를 완벽하게 기억하는 일, 그리고 @slash가 언급 한대로 (특수 기능이 달성 와일드 카드를 통해 암시 적으로 선택할 수 없습니다 * 또는 제 경우에 사용하는 "모든")

  3. ==============================

    3.나는 이런 종류의 문제를 발견하는 유일한 정말 허용 솔루션이 코드를했다 :

    나는 이런 종류의 문제를 발견하는 유일한 정말 허용 솔루션이 코드를했다 :

    @albums = Album.joins(:reviews).select("*, avg(reviews.rating) as average_rating").group_by(&:id).order("average_rating DESC")
    

    나는 사람을 도움이되기를 바랍니다.

  4. from https://stackoverflow.com/questions/20942477/groupingerror-error-column-must-appear-in-the-group-by-clause-or-be-used-in-an by cc-by-sa and MIT license