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
이상하게도, 만약에total
0 이상이거나 NULL이 아닌 경우의 수subs
표시된 것은 다음과 같습니다.total
6권의 책과 3개의 하위장르를 가지고 있습니다.sub
예를 들어 "sub1, sub1, sub2, sub2, sub3, sub3"입니다.
언제total
0인 경우,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
'programing' 카테고리의 다른 글
View에서 테이블 생성 - Oracle SQL 오류: ORA-01723: 길이가 0인 열은 허용되지 않습니다. (0) | 2023.08.15 |
---|---|
JQuery $.scrollTo() 함수를 사용하여 창을 스크롤하는 방법 (0) | 2023.08.15 |
Apache POI를 사용하여 CSV 데이터 가져오기 (0) | 2023.08.15 |
ASP.NET에서 웹 페이지를 이미지로 변환 (0) | 2023.08.15 |
작성된 경우 다른 테이블을 가리키는 뷰 유사 유사 테이블 작성 방법 (0) | 2023.08.15 |