source

MySQL 다중 왼쪽 결합 제한

gigabyte 2022. 10. 29. 10:01
반응형

MySQL 다중 왼쪽 결합 제한

서로 종속된 여러 왼쪽 조인을 가진 쿼리에 왼쪽 조인 제한을 설정하려면 어떻게 해야 합니까?LIMIT에 대한 코멘트는 다음과 같습니다.

SELECT 
    a.*,GROUP_CONCAT(c.body SEPARATOR ' ') AS bodies
FROM a   
    LEFT JOIN b ON b.id_a=a.id    
    LEFT JOIN c ON c.id=b.id_c LIMIT 5 # LIMIT 5 Here Does Not Work 
WHERE ...

샘플 데이터 세트...

DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (  
  `id` int(11) NOT NULL
);

-- Contains relationship between a and c
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `id_a` int(11) NOT NULL,
  `id_c` int(11) NOT NULL
);

-- Contains body contents
DROP TABLE IF EXISTS `c`;
CREATE TABLE `c` (
  `id` int(11) NOT NULL,
  `body` varchar(2000) NOT NULL
);


-- ----------------------------
-- Sample Records
-- ----------------------------
INSERT INTO `a` VALUES ('1');

INSERT INTO `b` VALUES 
('1','1'), ('1','2'), ('1','3'),
('1','4'), ('1','5'), ('1','6'),
('1','7'), ('1','8'), ('1','9'), 
('1','10');

INSERT INTO `c` VALUES
('1','aa'),('2','bb'), ('3','cc'),
('4','dd'), ('5','ee'), ('6','ff'),
('7','gg'), ('8','hh'), ('9','ii'),
('10','jj');

SQLFiddle은 http://sqlfiddle.com/ #!9/c1822/12 로 문의해 주십시오.

또한 서브쿼리 개서를 시도했지만 네스트된 서브쿼리에서 외부 테이블에 액세스할 수 없어 "a.id"에서 실패하고 "where 절"이 표시되므로 작동하지 않습니다.http://sqlfiddle.com/ #!9/c1822/3

또한 find_in_set rewrite http://sqlfiddle.com/#!9/2d43bb/1의 서브쿼리도 있습니다.이 서브쿼리는 동작하지만 큰 데이터 세트에서는 속도가 너무 느립니다.

변수를 사용하여 하위 쿼리의 각 행에 번호를 지정할 수 있습니다.그런 다음 해당 숫자를 기준으로 행을 필터링할 수 있습니다.이 예에서는, 다음의 값을 제한하고 있습니다.left join최대 3개의 결과까지 동일한 결과를 제공합니다.t1_id:

select  *
from    table1 t1
left join
        (
        select  @rn := case when t1_id = @prev_id then @rn + 1 else 1 end rn
        ,       @prev_id := t1_id
        ,       t2.*
        from    table2 t2
        order by
                t1_id
        ) t2rn
on      t2rn.t1_id = t1.id
        and t2rn.rn < 4  -- At most 3 rows

SQL Fielen의 예.

다음은 변수를 사용하여 이를 작성하는 적절한 방법입니다.Andomar의 솔루션은 효과가 있을 수 있지만 다음과 같은 세 가지 문제를 안고 있습니다.

  • MySQL의 최신 버전에서는order by서브쿼리에 있어야 합니다.
  • 보다 중요한 것은 MySQL이 다음 명령어에서의 표현식의 평가 순서를 보증하지 않는다는 것입니다.select따라서 변수를 한 식에 할당하지 말고 다른 식에 사용해야 합니다.
  • 쿼리에서 변수가 초기화되지 않았습니다.

따라서 더 나은 버전은 다음과 같습니다.

select . . .
from table1 t1 left join
     (select t2.*,
             (@rn := if(@id = t2.t1_id, @rn + 1,
                        if(@id := t2.t1_id, 1, 1)
                       )
             ) as rn
      from (select t2.*
            table2 t2
            order by t1_id
           ) t2 cross join
           (select @rn := 0, @id := -1) params
     ) t2
     on t2.t1_id = t1.id
where t2.rn <= 5;  -- At most 5 rows

사용방법group_concat()는 것을 나타내고 있습니다.group by또한 필요합니다.그러나 행 제한에 대한 질문은 더 일반적인 것으로 보이며 실제로 달성하려는 항목에 대한 정보를 많이 제공하지 않습니다.

언급URL : https://stackoverflow.com/questions/50187560/mysql-multiple-left-join-limit

반응형