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
'programing' 카테고리의 다른 글
Angular 4 프로젝트에서 실행 중인 원고 버전을 확인하는 방법 (0) | 2023.08.11 |
---|---|
baselineAligned를 false로 설정하면 선형 레이아웃의 성능이 어떻게 향상됩니까? (0) | 2023.08.11 |
어떻게 하면 제 프로젝트를 깃허브에서 끌어낼 수 있을까요? (0) | 2023.08.11 |
jquery를 사용하여 입력 필드의 특수 문자를 차단하거나 제한하려면 어떻게 해야 합니까? (0) | 2023.08.11 |
관찰 가능한 RXJS 배열에 대한 단순 필터 (0) | 2023.08.11 |