테이블에서 다른 테이블의 행당 여러 행 가져오기
여기 문제가 있는데, 서버에서 여러 개의 쿼리를 하는 대신 한 번의 쿼리만으로 할 수 있는지 궁금합니다.
그래서 제가 원하는 것은 각 범주에서 24개의 제한된 상점 내에서 그 범주에 속하는 모든 상점을 검색하는 것입니다.즉, 내가 5개의 카테고리를 등록했다고 상상해보면 그 카테고리에 속하는 24개의 매장을 검색할 것이고, 결론적으로 나는 총 120개의 매장을 쿼리 결과에 포함시킬 것입니다.
다음 코드는 예제이지만 각 범주를 반복하지 않고 모든 범주의 처음 24개 저장소만 가져옵니다.
SELECT *
FROM categories c
LEFT JOIN (SELECT * FROM stores_categories LIMIT 24 OFFSET 0) sc ON sc.id_category = c.id
WHERE type = 'STORE' OR type = 'ALL';
누군가가 나에게 이것을 보내왔고, 그것은 나의 문제와 매우 유사합니다, 카테고리당 최신 4개의 아이템을 어떻게 선택합니까?,그런 식이지만, 각 카테고리에서 가장 최근의 24개가 아니라 페이지를 만들기 위해 제한하고 오프셋을 사용할 수 있으면 좋겠습니다.
내가 받은 링크의 예제 코드는 다음과 같습니다.
SELECT sc1.*
FROM stores_categories sc1
LEFT OUTER JOIN stores_categories sc2 ON (sc1.id_category = sc2.id_category AND sc1.id_store < sc2.id_store)
GROUP BY sc1.id_store
HAVING COUNT(*) < 24
ORDER BY sc1.id_category;
제가 속한 데이터베이스 서버는 버전 5.5.64-MariaDB입니다.데이터베이스에서 동일한 값으로 테스트를 수행할 수 있는 바이올린 예제입니다.https://www.db-fiddle.com/f/jcowJL9S4FQXqKg2yMa8kf/0
범주당 계산된 row_number를 사용할 수 있습니다.
--
-- Emulated row_number via variables
--
SELECT sc.id, id_store
, cat.name AS cat_name
, cat.type AS cat_type
, rn
FROM
(
SELECT sc.*
, @rn := CASE
WHEN @cat_id = sc.id_category
THEN @rn + 1 ELSE 1
END AS rn
, @cat_id := sc.id_category as cat_id
FROM stores_categories sc
CROSS JOIN (SELECT @cat_id:=0, @rn:=0) vars
ORDER BY sc.id_category, sc.id_store DESC, sc.id DESC
) sc
LEFT JOIN categories cat
ON cat.id = sc.id_category
WHERE rn BETWEEN 1 AND 24
ORDER BY sc.id_category, sc.id_store DESC, sc.id DESC
또는
--
-- Grouped self-join
--
SELECT sc.id, sc.id_store
, cat.name AS cat_name
, cat.type AS cat_type
, COUNT(sc2.id_store) AS cnt
FROM stores_categories sc
LEFT JOIN stores_categories sc2
ON sc2.id_category = sc.id_category
AND sc2.id_store >= sc.id_store
LEFT JOIN categories cat
ON cat.id = sc.id_category
GROUP BY sc.id
HAVING cnt BETWEEN 1 AND 24
ORDER BY sc.id_category, sc.id_store DESC;
또는
--
-- Correlated sub-query
--
SELECT sc.id, id_store
, cat.name AS cat_name
, cat.type AS cat_type
, ( select count(*)
from stores_categories sc2
where sc2.id_category = sc.id_category
and sc2.id_store >= sc.id_store
) as rn
FROM stores_categories AS sc
LEFT JOIN categories cat
ON cat.id = sc.id_category
HAVING rn BETWEEN 1 AND 24
ORDER BY sc.id_category, sc.id_store DESC;
db에 대한 데모<>여기서 fidle
언급URL : https://stackoverflow.com/questions/70118436/get-multiple-rows-from-a-table-to-per-row-of-another-table
'programing' 카테고리의 다른 글
Spring Data MongoDB: "주체 관계"를 구현하는 방법은 무엇입니까? (0) | 2023.06.29 |
---|---|
푸시하기 전에 여러 커밋을 하나로 결합 (0) | 2023.06.29 |
iAsyncCursor는 mongodbc# 드라이버와의 반복에 어떻게 사용됩니까? (0) | 2023.06.29 |
둥근 모서리로 레이아웃을 만드는 방법...? (0) | 2023.06.29 |
@MAPSTRUCT.소스 매개 변수에 "패키지"라는 속성이 없습니다. (0) | 2023.06.29 |