이온디
호스팅센터
웹디벨로퍼
프리랜서카페
스레드

contents 모듈 쿼리문

2025년 02월 23일

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번 쿼리를 사용하는 것이 가장 바람직합니다.

 


내용을 입력하세요
0
댓글은 로그인 사용자만 작성 가능합니다. 로그인하기