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
다음은 변수를 사용하여 이를 작성하는 적절한 방법입니다.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
'source' 카테고리의 다른 글
응답 코드 220이 필요하지만 Larabel에서 메시지 ""과 함께 코드 ""가 수신되었습니다. (0) | 2022.10.29 |
---|---|
Vuejs 공유 무선 구성 요소가 렌더에서 확인되지 않음 (0) | 2022.10.29 |
반복 요소를 사용하여 목록 작성 (0) | 2022.10.29 |
Spring Boot application.properties 값이 채워지지 않았습니다. (0) | 2022.10.29 |
Python이 virtualenv 내에서 실행 중인지 확인 (0) | 2022.10.29 |