> 데이터 베이스 > MySQL 튜토리얼 > 단일 SQL 쿼리로 범주당 4개의 최신 항목을 검색하는 방법은 무엇입니까?

단일 SQL 쿼리로 범주당 4개의 최신 항목을 검색하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-22 01:57:09
원래의
136명이 탐색했습니다.

How to Retrieve the Four Newest Items Per Category with a Single SQL Query?

한 번의 검색으로 각 카테고리의 최신 항목을 선택하세요

category_id라는 필드로 분류된 항목 데이터베이스에서 작업은 각각 가장 최근에 나열된 항목 4개를 포함하는 범주 목록을 검색하는 것입니다. 각 범주에 대해 개별적으로 데이터베이스를 쿼리하는 대신 단일 SQL 쿼리를 사용하여 데이터베이스 호출을 최적화합니다.

외부 조인을 사용한 솔루션:

다음 쿼리는 외부 조인을 사용하여 동일한 카테고리에서 업데이트된 항목이 있는 항목을 식별하고 제외합니다.

<code class="language-sql">SELECT i1.*
FROM item i1
LEFT OUTER JOIN item i2
  ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id)
GROUP BY i1.category_id, i1.item_id
HAVING COUNT(*) <= 4;</code>
로그인 후 복사

이 쿼리는 LEFT OUTER JOIN을 사용하여 각 항목(i1)을 동일한 카테고리의 업데이트된 항목 세트(i2)와 결합합니다. COUNT(*) 각 카테고리의 각 항목에 대한 일치 수를 계산하는 데 사용됩니다. HAVING 절은 일치 항목이 4개 이상인 항목을 필터링하여 각 범주에서 최신 항목 4개만 선택되도록 합니다.

MySQL 사용자 변수를 사용한 솔루션:

이 솔루션은 MySQL의 사용자 변수 기능을 활용하여 그룹 및 행 번호를 추적합니다.

<code class="language-sql">SELECT *
FROM (
    SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id
    FROM (SELECT @g:=null, @r:=0) AS _init
    CROSS JOIN item i
    ORDER BY i.category_id, date_listed DESC
) AS t
WHERE t.rownum <= 4;</code>
로그인 후 복사

이 쿼리에서는 사용자 정의 변수 @g@r를 사용하여 현재 카테고리와 행 번호를 추적하여 각 카테고리의 처음 4개 항목만 선택되도록 합니다.

MySQL 창 기능을 사용한 솔루션(MySQL 8.0.3):

MySQL 8.0.3에는 SQL 표준 창 기능에 대한 지원이 도입되어 더욱 간결하고 효율적인 솔루션을 제공합니다.

<code class="language-sql">WITH numbered_item AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY date_listed DESC) AS rownum
  FROM item
)
SELECT * FROM numbered_item WHERE rownum <= 4;</code>
로그인 후 복사

이 쿼리는 PARTITION BY category_id ORDER BY date_listed DESC 절을 사용하여 결과 집합을 범주별로 분할하고 항목을 각 파티션의 date_listed 열을 기준으로 내림차순으로 정렬합니다. 그런 다음 ROW_NUMBER() 창 기능은 각 파티션에 연속된 행 번호를 할당하여 각 범주의 처음 4개 항목을 선택할 수 있도록 합니다.

위 내용은 단일 SQL 쿼리로 범주당 4개의 최신 항목을 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿