한 번의 검색으로 각 카테고리의 최신 항목을 선택하세요
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!