MySQL: GROUP_CONCAT(왼쪽 결합 포함)
MySQL의 "GROUP_CONCAT" 기능에 문제가 있습니다.간단한 헬프 데스크 데이터베이스를 사용하여 문제를 설명하겠습니다.
CREATE TABLE Tickets (
id INTEGER NOT NULL PRIMARY KEY,
requester_name VARCHAR(255) NOT NULL,
description TEXT NOT NULL);
CREATE TABLE Solutions (
id INTEGER NOT NULL PRIMARY KEY,
ticket_id INTEGER NOT NULL,
technician_name VARCHAR(255) NOT NULL,
solution TEXT NOT NULL,
FOREIGN KEY (ticket_id) REFERENCES Tickets.id);
INSERT INTO Tickets VALUES(1, 'John Doe', 'My computer is not booting.');
INSERT INTO Tickets VALUES(2, 'Jane Doe', 'My browser keeps crashing.');
INSERT INTO Solutions VALUES(1, 1, 'Technician A', 'I tried to solve this but was unable to. I will pass this on to Technician B since he is more experienced than I am.');
INSERT INTO Solutions VALUES(2, 1, 'Technician B', 'I reseated the RAM and that fixed the problem.');
INSERT INTO Solutions VALUES(3, 2, 'Technician A', 'I was unable to figure this out. I will again pass this on to Technician B.');
INSERT INTO Solutions VALUES(4, 2, 'Technician B', 'I re-installed the browser and that fixed the problem.');
이 헬프 데스크 데이터베이스에는 각각2개의 솔루션엔트리가 있는 티켓이 2개 있어요목표는 SELECT 문을 사용하여 데이터베이스 내의 모든 티켓 목록을 부식 솔루션 엔트리와 함께 작성하는 것입니다.사용하고 있는 SELECT 문장은 다음과 같습니다.
SELECT Tickets.*, GROUP_CONCAT(Solutions.solution) AS CombinedSolutions
FROM Tickets
LEFT JOIN Solutions ON Tickets.id = Solutions.ticket_id
ORDER BY Tickets.id;
위의 SELECT 문의 문제는 한 행만 반환한다는 것입니다.
id: 1
requester_name: John Doe
description: My computer is not booting.
CombinedSolutions: I tried to solve this but was unable to. I will pass this on to Technician B since he is more experienced than I am.,I reseated the RAM and that fixed the problem.,I was unable to figure this out. I will again pass this on to Technician B.,I re-installed the browser and that fixed the problem.
티켓 1과 티켓 2의 솔루션 엔트리와 함께 티켓 1의 정보를 반환합니다.
내가 뭘 잘못하고 있지?감사합니다!
용도:
SELECT t.*,
x.combinedsolutions
FROM TICKETS t
LEFT JOIN (SELECT s.ticket_id,
GROUP_CONCAT(s.soution) AS combinedsolutions
FROM SOLUTIONS s
GROUP BY s.ticket_id) x ON x.ticket_id = t.ticket_id
대체:
SELECT t.*,
(SELECT GROUP_CONCAT(s.soution)
FROM SOLUTIONS s
WHERE s.ticket_id = t.ticket_id) AS combinedsolutions
FROM TICKETS t
GROUP_BY만 추가하면 됩니다.
SELECT Tickets.*, GROUP_CONCAT(Solutions.solution) AS CombinedSolutions FROM Tickets
LEFT JOIN Solutions ON Tickets.id = Solutions.ticket_id
GROUP_BY Tickets.id
ORDER BY Tickets.id;
@Dylan Valade의 코멘트가 가장 심플한 답변이라고 생각하기 때문에 다른 답변으로 올립니다.GROUP BY Tickets.id을 OP의 SELECT에 추가하는 것만으로 문제를 해결할 수 있습니다.그게 내 문제를 해결했어.
단, 크기가 작지 않은 데이터베이스의 경우, 특히 Tickets.id에 완전한 테이블스캔을 수반하지 않는 술어가 있는 것으로 보여지기 때문에 앞의 단락은 올바른 결과를 반환하지만 내 경우에는 훨씬 더 효율적이지 않은 것으로 보입니다.
언급URL : https://stackoverflow.com/questions/4455958/mysql-group-concat-with-left-join
'programing' 카테고리의 다른 글
Java 8: 람다의 반복 횟수를 세는 데 선호되는 방법? (0) | 2022.09.22 |
---|---|
중첩된 사전을 예쁘게 인쇄하는 방법 (0) | 2022.09.21 |
두 날짜 사이의 데이터 프레임 행 선택 (0) | 2022.09.21 |
MySQL: 플로트와 더블의 차이점은 무엇입니까? (0) | 2022.09.21 |
jQuery를 사용하여 부트스트랩 모달 창을 여는 방법 (0) | 2022.09.21 |