programing

행별 LIMIT와 함께 IN을 사용한 MariaDB 쿼리

linuxpc 2023. 7. 25. 20:41
반응형

행별 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

반응형