programing

MySQL 각각 여러 행으로 여러 테이블 결합

mailnote 2023. 9. 13. 22:54
반응형

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

반응형