programing

SELECT DISTINCT ON 쿼리를 Postgresql에서 MySQL로 변환하는 중

powerit 2023. 8. 11. 22:40
반응형

SELECT DISTINCT ON 쿼리를 Postgresql에서 MySQL로 변환하는 중

는 Postgre를 사용해 왔습니다.SQL사용하고 MySQL로 마이그레이션합니다.

제 질문에, 저는 Postgre를 사용하고 있습니다.SQL의SELECT DISTINCT ON (col1, col2, col3)MySQL에 이 문장과 대응되는 부분이 있는지 궁금합니다.

SELECT DISTINCTION ON을 MySQL로 사용하는 Postgresql 쿼리를 변환할 정확한 값은 없습니다.

Postgresql DISTINCT ON을 선택합니다.

Postgresql에서 다음 쿼리는 식이 다음과 같은 모든 행을 제거합니다.(col1, col2, col3)일치하는 각 행 집합에 대해 "첫 번째 col4, col5 행"만 유지합니다.

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename

테이블이 이와 같은 경우:

col1 | col2 | col3 | col4 | col5
--------------------------------
1    | 2    | 3    | 777  | 888
1    | 2    | 3    | 888  | 999
3    | 3    | 3    | 555  | 555

쿼리는 (1,2,3)에 대해 하나의 행만 유지하고 (3,3,3)에 대해 하나의 행만 유지합니다.그러면 결과 행은 다음과 같습니다.

col4 | col5
-----------
777  | 888
555  | 555

각 세트의 "첫 번째 행"은 예측할 수 없으며, 주문 기준을 지정하지 않는 한 첫 번째 행도 (888,999)일 수 있습니다.

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4

(표현식의 DISTINCT는 표현식별로 맨 왼쪽 순서와 일치해야 하지만 ORDER BY에는 추가 표현식이 포함될 수 있습니다.)

내SQL 확장명을 GROUP BY로 변경

MySQL은 GROUP BY 절에 이름이 지정되지 않은 비집계 열을 선택할 수 있도록 GROUP BY 사용을 확장합니다.집계되지 않은 열을 선택할 때마다 서버는 해당 열에서 각 그룹의 값을 자유롭게 선택할 수 있으므로 결과 값은 결정됩니다.

Postgresql 쿼리:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename

이 MySQL 쿼리와 동등한 것으로 간주할 수 있습니다.

SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3

Postgresql과 MySQL 모두 각(col1, col2, col3)에 대해 "첫 번째 행"을 반환하며, 두 경우 모두 절별로 지정 및 순서를 지정하지 않았기 때문에 반환된 행을 예측할 수 없습니다.

많은 사람들이 이 Postgresql 쿼리를 ORDER BY:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4

이것으로:

SELECT col4, col5
FROM (
  SELECT col1, col2, col3, col4, col5
  FROM tablename
  ORDER BY col1, col2, col3, col4
) s
GROUP BY col1, col2, col3

여기서의 아이디어는 하위 쿼리에 ORDER BY를 적용하여 MySQL이 col1, col2, col3으로 그룹화될 때 col4 및 col5에 대해 처음 발견된 값을 유지하도록 하는 것입니다.아이디어는 좋지만, 틀렸습니다!MySQL은 col4와 col5에 대한 값을 자유롭게 선택할 수 있으며, 어떤 값이 처음 발생하는지는 알 수 없으며 최적화 프로그램에 따라 다릅니다.그래서 저는 이것을 수정할 것입니다.

SELECT t1.col4, t1.col5
FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4
                              FROM tablename
                              GROUP BY col1, col2, col3) s
     ON t1.col1=s.col1
        AND t1.col2=s.col2
        AND t1.col3=s.col3
        AND t1.col4=s.m_col4
GROUP BY
  t1.col1, t1.col2, t1.col3, t1.col4

하지만 점점 더 복잡해지기 시작했습니다.

결론

일반적으로 Postgresql 쿼리를 MySQL 쿼리로 변환하는 정확한 방법은 없지만 해결 방법이 많습니다. 결과 쿼리는 원래 쿼리만큼 간단하거나 매우 복잡해질 수 있지만 쿼리 자체에 따라 다릅니다.

하위 쿼리를 사용하여 순서를 결정하고 외부 쿼리를 사용하여 순서를 그룹화합니다.

@은 부분 @a_horse_with_no_name을 하기 때문에 합니다.group by. DBMS는

예:

CREATE TABLE customer_order
    (`customer` varchar(5), `item` varchar(6), `date` datetime)
;

INSERT INTO customer_order
    (`customer`, `item`, `date`)
VALUES
    ('alice', 'widget', '2000-01-05 00:00:00'),
    ('bob', 'widget', '2000-01-02 00:00:00'),
    ('alice', 'widget', '2000-01-01 00:00:00'),
    ('alice', 'wodget', '2000-01-06 00:00:00')
;

각 고객의 첫 번째 주문에 대한 쿼리:

select *
from
  (select customer, item, date
  from customer_order
  order by date) c
group by customer

결과:

| CUSTOMER |   ITEM |                           DATE |
|----------|--------|--------------------------------|
|    alice | widget | January, 01 2000 00:00:00+0000 |
|      bob | widget | January, 02 2000 00:00:00+0000 |

http://sqlfiddle.com/ #!2/6cbbe/1

여러 열에서 고유한 값을 선택할 수 없습니다.이와 같은 쿼리 사용을 선택하는 동안

select distinct col1, col2 from table

이미 사용되지 않는 MYSQL 대신 PDO 또는 MSYQLI로 마이그레이션해야 합니다.

당신이 할 수 있는 당신의 질문에 대해.

   SELECT DISTINCT col1, col2, col3

또는

    SELECT col1, col2, col3
    ........

    GROUP BY col1 --//--- or whatever column you want to be distinct

언급URL : https://stackoverflow.com/questions/17673457/converting-select-distinct-on-queries-from-postgresql-to-mysql

반응형