1. 최근 판매된 상품 정렬
SELECT * FROM xe_contents_transaction
WHERE point > 0 ORDER BY xe_contents_transaction
.date
DESC limit 10;
- 가장 단순한 쿼리로, point가 0보다 큰 모든 거래 내역을 날짜 기준 내림차순으로 정렬하여 10개만 보여줍니다
- 동일한 title의 상품이 여러 번 판매되었다면 모두 결과에 포함됩니다
- 즉, 중복된 상품명이 결과에 나타날 수 있습니다
2. title이 중복되지 않은 최근 판매된 상품 정렬
SELECT *
FROM `xe_contents_transaction`
WHERE point > 0
GROUP BY title
ORDER BY `date` DESC
LIMIT 10;
- GROUP BY를 사용해 title 기준으로 그룹화합니다
- 하지만 이 쿼리는 잠재적인 문제가 있습니다:
- GROUP BY와 함께 집계함수 없이 일반 컬럼을 선택하면 예측할 수 없는 결과가 나올 수 있습니다
- 어떤 date 값이 선택될지 명확하지 않습니다
- MySQL은 이를 허용하지만, 표준 SQL과 다른 DBMS들은 이를 오류로 처리합니다
3. title이 중복되지 않은 최근 판매된 상품 정렬
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY title ORDER BY `date` DESC) AS rn
FROM `xe_contents_transaction`
WHERE point > 0
)
SELECT *
FROM ranked
WHERE rn = 1
ORDER BY `date` DESC
LIMIT 10;
- 윈도우 함수(ROW_NUMBER())를 사용한 가장 정확한 방법입니다
- 각 title별로 가장 최근 거래 건만 선택합니다
- PARTITION BY title로 같은 title끼리 그룹화하고
- ORDER BY date DESC로 각 그룹 내에서 가장 최근 날짜에 1번을 부여합니다
- WHERE rn = 1로 각 title의 가장 최근 거래만 선택합니다
- 결과적으로 중복 없이 가장 최근에 판매된 상품 10개를 정확하게 보여줍니다
결론적으로:
- 1번: 단순히 최근 거래 10건 (중복 가능)
- 2번: 그룹화는 했지만 결과가 부정확할 수 있는 쿼리
- 3번: 각 상품의 가장 최근 거래만 정확하게 보여주는 쿼리
상품별 최근 거래를 보고 싶다면 3번 쿼리를 사용하는 것이 가장 바람직합니다.