programing

JOIN 쿼리의 이상한 동작

itsource 2023. 8. 15. 20:46
반응형

JOIN 쿼리의 이상한 동작

제가 개발하고 있는 도서관 관리 시스템에는 문학 장르의 트리가 있는 테이블이 있습니다.이들은 IP(코드 2. 시, 코드 2.1. 서사시, 코드 2.1.2. 라틴 서사시 등)처럼 암호화되어 있습니다.

IP와 유사한 코드는 특정 장르뿐만 아니라 모든 하위 장르의 카운트도 허용합니다.도서관에 얼마나 많은 시들이 있는지 알고 싶다면, 제가 해야 할 일은 세는 것입니다.2.%법전

도서관의 필요에 따라 트리가 채워지기 때문에, 그들이 새 책을 받을 때, 이름이 붙은 필드가 있습니다.ord_vis행의 시각화 순서 지정(즉, 1911년 이탈리아-터키 전쟁에 대한 새 행은 6일 전쟁 이후 삽입되더라도 제2차 세계 대전과 제2차 세계 대전 이전에 표시되어야 함).

트리는 아래 쿼리로 제목 수를 세기로 결정할 때까지 원활하게 작동했습니다.

SELECT  a.id, a.code, a.level, a.parent, a.text,
        GROUP_CONCAT( b.text ORDER BY  b.ord_vis SEPARATOR ', ' ) AS subs,
        COUNT( books.id ) AS total
    FROM  tree AS a
    LEFT JOIN  books ON books.code LIKE CONCAT( a.code, '%' )
    LEFT JOIN  tree AS b ON b.parent = a.id
      AND  b.level = a.level +1
    WHERE  a.parent =42 -- this value is the user query
    GROUP BY  a.id
    ORDER BY  a.ord_vis ASC

이상하게도, 만약에total0 이상이거나 NULL이 아닌 경우의 수subs표시된 것은 다음과 같습니다.total6권의 책과 3개의 하위장르를 가지고 있습니다.sub예를 들어 "sub1, sub1, sub2, sub2, sub3, sub3"입니다.

언제total0인 경우,subs올바른 번호와 순서로 표시됩니다.

사용 가능한 모든 JOIN 옵션을 사용하여 쿼리를 테스트하지 못했으며 JOIN과 SELECT 필드의 순서도 변경하려고 했습니다.

저는 다음과 같은 방법으로 서브를 받는 라인을 수정하는 문제를 해결했습니다.GROUP_CONCAT(DISTINCT b.text ORDER BY b.ord_vis SEPARATOR ', ' ) AS subs하지만 저는 왜 제가 그 이상한 결과를 얻었는지 이해하고 싶습니다.DISTINCT.

단서는?

JOIN행 수가 폭발하는 경향이 있습니다.DISTINCT폭발에서 군림할 수 있는 방법입니다.

또 다른 접근 방식(때로는 효과가 있음)은 상관된 하위 쿼리입니다.실행 속도가 느릴 수 있습니다(그렇지 않을 수도 있음).

SELECT  a.id, a.code, a.level, a.parent, a.text, 
        ( SELECT  GROUP_CONCAT( text ORDER BY  ord_vis SEPARATOR ', ' )
            FROM  tree
            WHERE  parent = a.id
              AND  level = a.level +1 ) AS subs,
        COUNT( books.id ) AS total
    FROM  tree AS a
    LEFT JOIN  books ON books.code LIKE CONCAT( a.code, '%' )
    WHERE  a.parent =42 -- this value is the user query
    GROUP BY  a.id
    ORDER BY  a.ord_vis ASC 

(의심스러운 점은LEFT불필요합니까?)

언급URL : https://stackoverflow.com/questions/29444088/odd-behavior-of-a-join-query

반응형