반응형
MySQL 각각 여러 행으로 여러 테이블 결합
다른 테이블(foo)과 관련된 행이 1개 이상인 테이블(bar, baz)이 있습니다.bar & baz to foo에 가입하면 각 테이블의 각 행에 대한 결과가 나옵니다.
http://sqlfiddle.com/ #!9/1c13f2/1/0
CREATE TABLE foo (`id` int, `value` varchar(5));
INSERT INTO foo (`id`, `value`) VALUES
(1, 'two'),
(2, 'two'),
(3, 'one');
CREATE TABLE bar (`id` int, `foo_id` int, `value` int);
INSERT INTO bar (`id`, `foo_id`, `value`) VALUES
(1, 1, 1),
(2, 1, 1),
(3, 2, 1),
(4, 2, 1),
(5, 3, 1);
CREATE TABLE baz (`id` int, `foo_id` int, `value` int);
INSERT INTO baz (`id`, `foo_id`, `value`) VALUES
(1, 1, 1),
(2, 1, 1),
(3, 2, 1),
(4, 2, 1),
(5, 3, 1);
질문:
SELECT foo.value, SUM(bar.value), SUM(baz.value)
FROM foo
JOIN bar ON bar.foo_id = foo.id
JOIN baz ON baz.foo_id = foo.id
GROUP BY foo.id
결과:
value SUM(bar.value) SUM(baz.value)
two 4 4
two 4 4
one 1 1
예상 결과:
value SUM(bar.value) SUM(baz.value)
two 2 2
two 2 2
one 1 1
결과적으로 교차(반카테시안) 제품에서 여러 행의 예상되는 동작이 발생합니다.bar여러 행에 일치하는baz.
이를 방지하기 위해, 우리는 다음의 수를 미리 집계할 수 있습니다.bar그리고.baz, 그 다음에 조인을 합니다.
또한 일치하는 행이 있을 때 예상되는 결과가 무엇인지 고려합니다.bar일치하는 행이 없습니다.baz. 합계를 반환하시겠습니까?bar? 현재의 쿼리로, 우리는 그들로부터 완전한 정보를 얻지 못할 것입니다.bar. (예시 데이터에서 행 id=5를 삭제한 후 쿼리가 반환되는 내용을 고려합니다.baz.)
질문을 이렇게 적겠습니다.
SELECT foo.value
, IFNULL( r.tot_bar_value ,0) AS tot_bar_value
, IFNULL( z.tot_baz_value ,0) AS tot_baz_value
FROM foo
LEFT
JOIN ( -- aggregate total from bar
SELECT bar.foo_id
, SUM(bar.value) AS tot_bar_value
FROM bar
GROUP BY bar.foo_id
) r
ON r.foo_id = foo.id
LEFT
JOIN ( -- aggregate total from bar
SELECT baz.foo_id
, SUM(baz.value) AS tot_baz_value
FROM baz
GROUP BY baz.foo_id
) z
ON z.foo_id = foo.id
두 행이 일치하지 않을 때 케이스를 처리하기 위해 외부 조인을 사용하고 있습니다.bar아니면baz.
테스트를 위해 부모 내부의 SELECT 쿼리만 따로 실행하여 반환되는 내용을 확인할 수 있습니다.
언급URL : https://stackoverflow.com/questions/59073476/mysql-joining-multiple-tables-each-with-multiple-rows
반응형
'programing' 카테고리의 다른 글
| R 일 년으로 여러 열을 퍼 나르고 있음 (0) | 2023.09.18 |
|---|---|
| naN 플로트를 c에서 생성하는 방법은? (0) | 2023.09.18 |
| 앱(Layout) XML 변수에서 매니페스트 버전 번호를 얻으려면 어떻게 해야 합니까? (0) | 2023.09.13 |
| Spring Boot 응용 프로그램을 시작할 때 RMI TCP 연결 오류가 발생했습니다. (0) | 2023.09.13 |
| GitHub 웹사이트에서 디렉토리/폴더 이름을 변경하는 방법은? (0) | 2023.09.13 |