Laravel을 사용하여 프로젝트를 구축하고 있으며 모든 제품이 포함된 테이블이 있습니다. 이 테이블에는 매일 제품이 추가되며 created_at
별로 정렬된 페이지에 모든 제품이 표시됩니다. 이는 Laravel Eloquent 및 ->orderBy('created_at', 'DESC')
를 사용하여 쉽게 수행할 수 있습니다.
그러나 특정 제품을 특정 위치에 "고정"/"고정"할 수 있었으면 좋겠습니다. 이를 위해 반환된 쿼리 컬렉션에 제품이 포함해야 하는 번호가 포함된 rank_index
열을 만들었습니다.
현재 테이블은 다음과 같습니다.
제목 순위_색인 생성_at 멋진 제품입니다 2023-01-01 10:04:00 다른 상품 4 2023-01-01 10:00:00 아기자동차 2023-01-01 10:05:00 그린카펫 2 2023-01-01 10:08:00 장난감 2023-01-01 10:07:00
다음 표는 쿼리에서 반환할 컬렉션을 보여줍니다.
제목 순위_색인 생성_at 장난감 2023-01-01 10:07:00 그린카펫 2 2023-01-01 10:08:00 아기자동차 2023-01-01 10:05:00 다른 상품 4 2023-01-01 10:00:00 멋진 제품입니다 2023-01-01 10:04:00
데이터베이스에서 직접 테이블을 반환할 수 있는 솔루션이 있기를 바랍니다. 이렇게 하면 요청을 훨씬 느리게 만드는 컬렉션을 분할하고 슬라이스할 필요가 없습니다! 그렇지 않으면 PHP 함수를 사용하여 컬렉션을 재배열하고 분할하고 슬라이스해야 합니다.
어떤 도움이라도 기꺼이 드리겠습니다!
감사합니다
저는 거의 확실하게 은용액을 선택하겠습니다
귀하의 진술:
말도 안 돼요. 두 결과 세트를 함께 분할/슬라이싱/연결하는 것은 성능에 측정 가능한 영향을 미치지 않을 것입니다. 확실히"요청이 느려지는"것은 아닙니다!
이것은 귀하의 시나리오에 맞는 SQL 솔루션이지만 관련된 테이블의 크기에 따라 두 개의 결과 집합을 함께 연결하는 것보다 속도가 거의 확실히 느립니다.
으아악장난감이 1000개보다 많으면여기에 설명된 대로 재귀 cte가 기본값cte_max_recursion_length에 도달합니다.
위 쿼리 앞에 다음 명령을 실행하여 제한을 제거할 수 있습니다.
으아악또는toys테이블에서 "nofollow noreferrer">ROW_NUMBER()를 사용하여 재귀 CTE를 비재귀 CTE로 변경합니다.
으아악이것은 당신이 가지고 놀 수 있는dbfiddle입니다.
올해에는 쿼리에서 직접 정렬하는 것이 더 복잡합니다.MySQL 결과 세트는 고정 위치별로 정렬됩니다복잡성을 자세히 이해하고 싶다면 이 질문을 참조하세요.
이전에 했던 작업은 비교적 간단하고 두 가지 쿼리를 통해 완성되었는데,
다음은 참고할 수 있는 예시입니다
으아악