programing

테이블에서 다른 테이블의 행당 여러 행 가져오기

newsource 2023. 6. 29. 20:11

테이블에서 다른 테이블의 행당 여러 행 가져오기

여기 문제가 있는데, 서버에서 여러 개의 쿼리를 하는 대신 한 번의 쿼리만으로 할 수 있는지 궁금합니다.

Example of database

그래서 제가 원하는 것은 각 범주에서 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