복붙노트

[SQL] PostgreSQL을에 선택 MySQL의 변환

SQL

PostgreSQL을에 선택 MySQL의 변환

내가 MySQL의에서 제대로 작동이 쿼리가 있습니다. 여기에 대한 자세한 배경.

SELECT c.*, SUM(ABS(v.vote)) AS score
FROM categories c,items i, votes v
    WHERE c.id = i.category_id
    AND i.id = v.voteable_id
    AND v.created_at > '#{1.week.ago}'
GROUP BY c.id
ORDER BY score DESC LIMIT 8;

나는 PostgreSQL의에서 실행 시도하고,이 오류 메시지와 함께 실패했습니다.

나는 (항목의 이름이 고유 가정, MySQL은 같은 두 작업을) GROUP BY 절에 "c.name"에 "c.id"를 변경 시도, 그래서 이것이 의미가 있는지 무엇을하지 않았다.

그러나 이것은 단지 다른 유사한 오류 발생

이 문제는 어떻게 해결 될 수 있는가?

해결법

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

    1.당신은 당신이 그룹화되어 SELECT의 목록 열 이름에 있습니다 :

    당신은 당신이 그룹화되어 SELECT의 목록 열 이름에 있습니다 :

    SELECT c.id, c.name, SUM(ABS(v.vote)) AS score
    FROM categories c,items i, votes v
      WHERE c.id = i.category_id
      AND i.id = v.voteable_id
      AND v.created_at > '#{1.week.ago}'
    GROUP BY c.id, c.name
    ORDER BY score DESC LIMIT 8;
    

    "GROUP BY 절에서 참조되지 않은 SELECT 절에 열 이름을 포함하도록 허용되지 않습니다."

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

    2.난 그냥 MySQL의에서 SQL 서버로가는 그 문제 만이 있었다. 나는이 이상한 수 있다는 사실을 생각했다!

    난 그냥 MySQL의에서 SQL 서버로가는 그 문제 만이 있었다. 나는이 이상한 수 있다는 사실을 생각했다!

    당신이 GROUP BY 절을 할 때 예, 대부분의 데이터베이스에서, 당신은 단지 GROUP BY 절에 나타나는 열 또는 열 집계를 선택할 수 있습니다. 그것은 다른 열 당신이있는 거 선택이 진정으로 고유하거나하지 않은 경우 알 수있는 방법이 없기 때문입니다.

    단지 그들이 참으로 독특한 경우는 GROUP BY에서 원하는 열을 넣어. 이것은 의심했다 MySQL의의 "기능"이었다.

    당신은 MySQL을의 행동과 어떻게 여기에 다른에 대해 읽을 수 있습니다.

    예:

    SELECT c.*, SUM(ABS(v.vote)) AS score
    FROM categories c,items i, votes v
        WHERE c.id = i.category_id
        AND i.id = v.voteable_id
        AND v.created_at > '#{1.week.ago}'
    GROUP BY c.id, c.name, c.whatever_else
    ORDER BY score DESC LIMIT 8;
    
  3. ==============================

    3.당신이 당신의 문을 변경하는 경우 그것을 작동합니다 :

    당신이 당신의 문을 변경하는 경우 그것을 작동합니다 :

    SELECT c.id, SUM(ABS(v.vote)) AS score
    FROM categories c,items i, votes v
      WHERE c.id = i.category_id
      AND i.id = v.voteable_id
      AND v.created_at > '#{1.week.ago}'
    GROUP BY c.id
    ORDER BY score DESC LIMIT 8;
    

    나는 확실히 MySQL은 결과로주는 무슨 모르겠지만, 당신이 PostgreSQL의에서 작업을하지 않는 이유의 아주 작은 예를 제공하기 위해, 다음과 같은 범주 테이블을 살펴 :

    id | name
    ---|-----
     1 | ABC
     1 | DEF
    

    당신은 그룹 ID로, 그래서 결과의 각 행은 하나의 ID를 포함해야합니다. 당신은 또한 이름을 선택하면, 그것에 의해 그룹화하지 않고, 무슨 이름에 대한 결과에 표시해야합니까?

    그것은 ABC 또는 DEF가 될 수 있지만 (MySQL은 분명하지 않지만) 데이터베이스 엔진은 정말 당신을 위해 결정할 수 없습니다.

  4. from https://stackoverflow.com/questions/1062158/converting-mysql-select-to-postgresql by cc-by-sa and MIT license