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 ;