서브쿼리 넣었을시 정렬이 풀리나요? 0 2 222

by 드락 [2021.02.16 13:46:48]


SELECT * FROM (SELECT * FROM db order by IDX DESC) AS A GROUP BY A.ID ORDER BY IDX DESC ;

를 사용해서 그룹핑한 ID에서 가장 큰IDX(최신의)값을 불러오려고 하는데 서브쿼리에 order by 값이 풀려서 나오는데 

혹시 문제가 어디인가요?

by 마농 [2021.02.16 14:42:29]

1. MySQL 만의 그룹바이 특성을 이용한 비표준 방법인 듯 한데요.
- 그룰바이 기준 항목이 아닌 항목을 집계함수 없이 조회시 오류가 발생하는 것이 표준이지만
- MySQL 에서는 오류가 나지 않고 첫번째로 읽혀진 값이 표시됨.
2. 표준 구문으로도 원하는 결과를 얻을 수 있을 것입니다.
- 집계결과를 이용해 다시 조인하거나 서브쿼리로 활용하는 방식이 될 수 있고, 다양한 방법이 가능합니다.
- 분석함수 사용 가능 버전이라면 더욱 더 편리하게 구할 수 있습니다.
3. 서브쿼리에서의 정렬이 무시되는 현상
- 아마도? 서브쿼리에서의 정렬은 무의미하다고 판단하는 것 같습니다.
- 서브쿼리 정렬은 LIMIT 구문이 있을 때 의미가 있으므로
- LIMIT 구문을 추가하여 해결할 수도 있습니다.
- 다만, 표준 구문을 사용하시기를 권장합니다.
4. SELECT *
- * 를 사용하는 것 보다는 실제 필요한 항목만 나열하는 것을 권장합니다.
 

-- MySQL 그룹바이, 서브쿼리에 LIMIT 추가 --
SELECT *
  FROM (SELECT *
          FROM db
         ORDER BY idx DESC
         LIMIT 99999
        ) a
 GROUP BY id
 ORDER BY idx DESC
;

-- 최신행 구하는 다양한 방법 --
SELECT a.*
  FROM db a
 INNER JOIN (SELECT MAX(idx) FROM db GROUP BY id) b
    ON a.idx = b.idx
 ORDER BY a.idx DESC
;
SELECT *
  FROM db
 WHERE idx IN (SELECT MAX(idx) FROM db GROUP BY id)
 ORDER BY idx DESC
;
SELECT a.*
  FROM db a
 WHERE NOT EXISTS (SELECT * FROM db b WHERE b.id = a.id AND b.idx > a.idx)
 ORDER BY a.idx DESC
;
SELECT a.*
  FROM db a
  LEFT JOIN db b
    ON a.id = b.id
   AND a.idx < b.idx
 WHERE b.idx IS NULL
 ORDER BY a.idx DESC
;

-- 분석함수 --
SELECT *
  FROM (SELECT *
             , ROW_NUMBER() OVER(PARTITION BY id ORDER BY idx DESC) rn
          FROM db
        ) a
 WHERE rn = 1
 ORDER BY idx DESC
;

 


by 드락 [2021.02.16 15:33:59]

감사합니다!

표준 구문을 많이 참조해봐야겠네요!

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입