복붙노트

[RUBY-ON-RAILS] PG는 :: 오류 : DISTINCT SELECT, 표현 BY ORDER은 선택 목록에 표시되어야합니다

RUBY-ON-RAILS

PG는 :: 오류 : DISTINCT SELECT, 표현 BY ORDER은 선택 목록에 표시되어야합니다

나는 이벤트 웹 사이트를 만드는 그리고 난 이벤트의 시작 시간에 의해 렌더링 된 답장을 정렬하는 데 노력하고있어. 거기에 내가 별개로 그룹화하고있어 그래서 답장이 많이 있습니다,하지만 난 PG에 팝업이 오류없이 결과를 정렬에 지난 몇 일 동안 많은 어려움을 가지고 있었어요. 나는 주제에 대한 이전의 몇 가지 질문을 검토 한 결과 여전히 꽤 손실입니다. 어떻게이 작업을 얻을 수 있나요? 정말 고맙습니다!

@rsvps = Rsvp.where(:voter_id => current_user.following.collect {|f| f["id"]}, :status => 'going').where("start_time > ? AND start_time < ?", Time.now, Time.now + 1.month).order("count_all desc").count(:group => :event_id).collect { |f| f[0] }

<%= render :partial => 'rsvps/rsvp', :collection => Rsvp.where(:event_id => @rsvps).select("DISTINCT(event_id)").order('start_time asc') %>

해결법

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

    1.DISTINCT가 적용된 후 ORDER BY 절에만 적용 할 수 있습니다. SELECT 문에서 필드 만이 DISTINCT 작업을 위해 고려되기 때문에, 그 유일한 필드는 주문에 의해 사용할 수 있습니다.

    DISTINCT가 적용된 후 ORDER BY 절에만 적용 할 수 있습니다. SELECT 문에서 필드 만이 DISTINCT 작업을 위해 고려되기 때문에, 그 유일한 필드는 주문에 의해 사용할 수 있습니다.

    당신은 단지 한 event_id 값의 고유 한 목록을 원하는 경우 논리적으로, 그들은 무관해야한다 무엇을에서 발생하는 주문하십시오. 순서가 중요합니까 경우 순서에 대한 상황이 있도록, 당신은 SELECT 목록에 start_time을 추가해야합니다.

    또한,이 두 SELECT 절은 해당되지 않으므로주의 :

    SELECT DISTINCT(event_id, start_time) FROM ...
    
    SELECT DISTINCT event_id, start_time FROM ...
    

    두 번째는 당신이 원하는 형태입니다. 첫 번째 행의 구조로 표현되는 데이터를 일련의 레코드 (튜플 내부 단일 열)를 반환한다. 두 번째 출력되는 데이터의 정상 열을 반환한다. 그것은 단지 하나의 열이기 때문에 ROW 구조가 아래로 감소된다 단일 열 경우 예상대로에만 작동합니다.

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

    2.나는이 다소 오래된 질문 알지만, 난 그냥 내가 포스트 그레스는 열 BY SELECT DISTINCT / 주문이 보이는 이상한 제한이 이유를 이해 도움이 내 머리에 작은 예를 통해 갔다.

    나는이 다소 오래된 질문 알지만, 난 그냥 내가 포스트 그레스는 열 BY SELECT DISTINCT / 주문이 보이는 이상한 제한이 이유를 이해 도움이 내 머리에 작은 예를 통해 갔다.

    당신이 당신의 RSVP 테이블에 다음과 같은 데이터가 있다고 가정 해 보겠습니다 :

     event_id |        start_time
    ----------+------------------------
        0     | Mar 17, 2013  12:00:00
        1     |  Jan 1, 1970  00:00:00
        1     | Aug 21, 2013  16:30:00
        2     |  Jun 9, 2012  08:45:00
    

    이제 각각의 start_times의 지시 별개의 event_ids의 목록을 잡아 싶어요. 그러나 1 어디를 가야하나요? 하나의 튜플이 1970년 1월 1일에 시작하기 때문에이 먼저 온 경우, 또는 때문에 2013년 8월 21일의 마지막 가야하나요?

    데이터베이스 시스템은 (가정 EVENT_ID이 고유)에서 작동 될 수있는 실제 데이터에 의존 할 수없는 당신을 위해 그 결정 및 쿼리의 구문을 만들 수 없습니다, 우리는 단지 SELECT 절에서 열을 기준으로 정렬 제한됩니다 .

    실제 문제에 관해서는 - 매튜의 대답에 대한 대안은 정렬 MIN 또는 MAX 같은 집계 함수를 사용하고 있습니다 :

      SELECT event_id
        FROM Rsvp
    GROUP BY event_id
    ORDER BY MIN(start_time)
    

    START_TIME에 명시 적 그룹화 및 집계 결과 튜플의 명확한 주문을 마련하기 위해 데이터베이스를 허용합니다. 가독성은 확실히이 경우에 문제가 있다는 점에 유의)

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

    3.당신이 START_TIME 컬럼을 사용하고 있기 때문에, 당신은 PostgreSQL을의 창 기능 중 하나 인 ROW_NUMBER ()를 사용하고 그것을 적재 할 수 있습니다

    당신이 START_TIME 컬럼을 사용하고 있기 때문에, 당신은 PostgreSQL을의 창 기능 중 하나 인 ROW_NUMBER ()를 사용하고 그것을 적재 할 수 있습니다

    당신은 또한 당신의 요구 사항에 따라 서로 다른 창 기능을 사용할 수 있습니다.

  4. from https://stackoverflow.com/questions/12693089/pgerror-select-distinct-order-by-expressions-must-appear-in-select-list by cc-by-sa and MIT license