행별 LIMIT와 함께 IN을 사용한 MariaDB 쿼리
하위 쿼리 중 하나에서 LIMIT를 사용하는 데 약간의 문제가 있습니다. 오류가 발생했습니다.
MariaDB doesn't yet support 'LIMIT in subquery'
내가 Postgre에서 한 것과 유사한 질문에.자식이 있는 모든 부모에 대해 3개의 자식 결과를 얻기 위한 SQL
select * from parent
join child on child.ch_pa_id = parent.pa_id
and child.ch_id in (
select child.ch_id from child
where child.ch_id = parent.pa_id
limit 3
)
order by parent.pa_id;
저는 여기서 같은 것에 대한 질문이 있는 것을 보았습니다.
MySQL - 이 버전의 MySQL은 아직 'LIMIT & IN/ALL/ANY/SOME' 하위 쿼리를 지원하지 않습니다.
질문에 답이 있지만 주로 조인으로 행별로 수행해야 하기 때문에 필요에 맞게 작업할 수 없습니다. 쿼리에 동일한 작업을 적용하려고 했지만 조인을 계속 작동시키는 방법을 잘 모르겠습니다.
select * from parent as p
join (
select * from child
where child.ch_pa_idno = p.pa_idno # this line breaks it
limit 3
) as c on c.ch_pa_id = p.pa_id
order by p.pa_id;
p.pa _idno가 Unknown 열이라는 오류가 발생하고 있습니다. 제가 바보처럼 행동하고 있는 것이 확실하며 여기에 분명히 잘못된 것이 있습니다.
예
다음은 Postgre로 수행한 작업 예제입니다.SQL http://sqlfiddle.com/ #!17/4ed4d/2.두 개의 부모 레코드만 반환하고 각 부모에 대해 두 개의 자식 레코드만 반환합니다.
원래 쿼리의 해결 방법:
SELECT * FROM parent
JOIN child ON child.ch_pa_id = parent.pa_id
AND child.ch_id IN
(SELECT ch_id FROM (
SELECT child.ch_id FROM child JOIN parent
WHERE child.ch_id = parent.pa_id
LIMIT 3) a
)
ORDER BY parent.pa_id;
추출할 원래 하위 쿼리 작업 유지ch_id
와의 어린이 식탁에서.LIMIT 3
그러나 추가함으로써parent
접합부에 있는 테이블그런 다음 다른 작업을 수행하여 하위 쿼리 결과를 얻은 다음 이 결과를 사용합니다.IN
.
편집: 작업 질문이 있지만 이에 대해 복잡한 느낌이 듭니다.
SELECT * FROM parent
JOIN child ON parent.pa_id=child.ch_pa_id
LEFT JOIN (
SELECT ch_pa_id,SUBSTRING_INDEX(chid,' ',1) f,SUBSTRING_INDEX(chid,' ',-1) e
FROM (
SELECT ch_pa_id,
SUBSTRING_INDEX(GROUP_CONCAT(ch_id ORDER BY ch_id ASC SEPARATOR ' '),' ',3) chid
FROM child
GROUP BY ch_pa_id) a) b
ON child.ch_pa_id=b.ch_pa_id
WHERE child.ch_id
BETWEEN f AND e;
솔직히 대용량 데이터에서는 성능이 좋지 않을 것 같지만, 항상 새로운 것과 최근에 발견한 기능 중 일부를 배우고 있습니다.
당신의 바이올린에 따르면, 당신이 처음 3개만 가져가는 것을 알아챘습니다.ch_id
모든 부모를 위하여그러므로, 이것은SUBSTRING_INDEX(GROUP_CONCAT(ch_id ORDER BY ch_id ASC SEPARATOR ' '),' ',3) chid
.GROUP_CONCAT
데이터를 수평으로 표시합니다.SUBSTRING_INDEX
첫 번째 3을 얻는 것ch_id
집회 중에일반적으로 group_concat은 다음과 같은 값을 반환합니다.1,2,3
및 substring_index는 [space](' ')로 구분된 첫 번째, 두 번째 및 기타 값만 식별할 수 있습니다.그래서 제가.SEPARATOR ' '
.
그러면 저는SUBSTRING_INDEX
정의할 외부 쿼리에서 두 번f
그리고.e
거기서SUBSTRING_INDEX(chid,' ',1)
첫 번째 값을 얻는 것과SUBSTRING_INDEX(chid,' ',-1)
열에서 마지막 값을 가져옵니다.그리고 그것과 함께 저는 원래 쿼리와 함께 참여하고 추가했습니다.BETWEEN f and e
.
원하는 결과를 말로 설명해 주세요.
이를 통해 원하는 것을 얻을 수 있는지 확인하십시오.
SELECT p.*
FROM parent AS p
JOIN child AS c ON c.ch_pa_idno = p.pa_idno
ORDER BY p.pa_id
LIMIT 3
때문에 혼란스럽습니다.pa_
은 ", 에는 "부모님", "부모님"처럼 .ch_
"부모"를 나타냅니다.
그리고 사이의 차이점은 무엇입니까?_id
그리고._idno
?
부모-자녀(계층적) 관계의 많은 구현에서 두 가지는 동일한 테이블에 있습니다.에 테블은이 .PRIMARY KEY(id)
라칼럼 있다습니이라는 칼럼.parent_id
그런 다음 "셀프 조인"은 부모와 자녀 사이를 연결하는 데 사용됩니다.
당신이 제공하는 것도 도움이 될 수 있습니다.SHOW CREATE TABLE
둘 다를 위하여parent
그리고.child
.
언급URL : https://stackoverflow.com/questions/55867806/mariadb-query-using-in-with-limit-by-row
'programing' 카테고리의 다른 글
SQL 구문은 대소문자를 구분합니까? (0) | 2023.07.25 |
---|---|
개체의 값을 사용하여 키 (0) | 2023.07.25 |
삽입할 때 두 값 사이를 뒤섞어 열에 두 값을 DEFAULT로 지정하는 방법 (0) | 2023.07.25 |
Oracle RAC 및 시퀀스 (0) | 2023.07.25 |
스프링 부트의 유효성 검사 중첩 (0) | 2023.07.25 |