복붙노트

[SQL] 내부는 세 개의 테이블에 수 ()에 가입

SQL

내부는 세 개의 테이블에 수 ()에 가입

간단하고 빠른 질문, 나는 그 테이블이 :

//table people
| pe_id | pe_name |
| 1  | Foo  |
| 2  | Bar  |
//orders table
| ord_id | pe_id | ord_title   |
|   1    |   1   | First order |
|   2    |   2   | Order two   |
|   3    |   2   | Third order |
//items table
| item_id | ord_id | pe_id | title  |
|   1     |   1    |   1   | Apple  |
|   2     |   1    |   1   | Pear   |
|   3     |   2    |   2   | Apple  |
|   4     |   3    |   2   | Orange |
|   5     |   3    |   2   | Coke   |
|   6     |   3    |   2   | Cake   |

나는 쿼리, 모든 사람을 나열 주문의 수와 같은 항목의 총 수를 계산이 필요합니다 :

| pe_name | num_orders | num_items |
| Foo  |    1       |   2       |
| Bar  |    2       |   4       |

하지만 난 그것이 작동 할 수 없습니다! 나는 시도

SELECT
    people.pe_name,
    COUNT(orders.ord_id) AS num_orders,
    COUNT(items.item_id) AS num_items
FROM
    people
    INNER JOIN orders ON (orders.pe_id = people.pe_id)
    INNER JOIN items ON items.pe_id = people.pe_id
GROUP BY
    people.pe_id;

그러나이 반환 num_ * 잘못된 값 :

| name | num_orders | num_items |
| Foo  |    2       |   2       |
| Bar  |    8       |   8       |

난 내가 한 번에 하나의 테이블에 가입하려고하면, 그것이 작동하는 것으로 나타났습니다 :

SELECT
    people.pe_name,
    COUNT(orders.ord_id) AS num_orders
FROM
    people
    INNER JOIN orders ON (orders.pe_id = people.pe_id)
GROUP BY
    people.pe_id;

//give me:
| pe_name | num_orders |
| Foo     |          1 |
| Bar     |          2 |

//and:
SELECT
    people.pe_name,
    COUNT(items.item_id) AS num_items
FROM
    people
    INNER JOIN items ON (items.pe_id = people.pe_id)
GROUP BY
    people.pe_id;
//output:
| pe_name | num_items |
| Foo     |         2 |
| Bar     |         4 |

어떻게에서 두 쿼리를 결합하려면?

해결법

  1. ==============================

    1.그것은 사람들과보다 주문과 아이템에 가입하는 것이 더 의미가 있습니다!

    그것은 사람들과보다 주문과 아이템에 가입하는 것이 더 의미가 있습니다!

    SELECT
        people.pe_name,
        COUNT(distinct orders.ord_id) AS num_orders,
        COUNT(items.item_id) AS num_items
    FROM
        people
        INNER JOIN orders ON orders.pe_id = people.pe_id
             INNER JOIN items ON items.ord_id = orders.ord_id
    GROUP BY
        people.pe_id;
    

    사람들과 항목을 가입하면 doublons 많이 불러 일으킨다. 예를 들어, 순서 3의 케이크 항목은이 사람들 사이의 결합을 통해 순서 2와 연결되며,이 일이하고 싶지 않아!

    그래서 :

    1 당신은 당신의 스키마 잘 이해가 필요합니다. 항목은 주문에, 그리고 사람에 대한 링크입니다.

    2 - 당신은 다른 사람이 주문 많은 항목으로 계산됩니다, 한 사람에 대해서는 다른 주문을 계산해야합니다.

  2. ==============================

    2.프랭크가 지적한 것처럼, 당신은 DISTINCT 사용해야합니다. 또한, 당신은 당신이 조인 당신의 전체 키를 사용하는 것이 확인해야합니다 (BTW, 완벽하게 괜찮습니다) 복합 기본 키를 사용하고 있기 때문에 :

    프랭크가 지적한 것처럼, 당신은 DISTINCT 사용해야합니다. 또한, 당신은 당신이 조인 당신의 전체 키를 사용하는 것이 확인해야합니다 (BTW, 완벽하게 괜찮습니다) 복합 기본 키를 사용하고 있기 때문에 :

    SELECT
        P.pe_name,
        COUNT(DISTINCT O.ord_id) AS num_orders,
        COUNT(I.item_id) AS num_items
    FROM
        People P
    INNER JOIN Orders O ON
        O.pe_id = P.pe_id
    INNER JOIN Items I ON
        I.ord_id = O.ord_id AND
        I.pe_id = O.pe_id
    GROUP BY
        P.pe_name
    

    I.ord_id = O.ord_id없이 그 사람에 대한 모든 주문 행에 각 항목 행에 합류했다.

  3. ==============================

    3.나는, 모두 별개의 퍼팅 시도 num_order으로 (별개 ord.ord_id)를 카운트 NUM 항목으로 (별개 items.item_id)를 계산

    나는, 모두 별개의 퍼팅 시도 num_order으로 (별개 ord.ord_id)를 카운트 NUM 항목으로 (별개 items.item_id)를 계산

    그것의 작동 :)

        SELECT
             people.pe_name,
             COUNT(distinct orders.ord_id) AS num_orders,
             COUNT(distinct items.item_id) AS num_items
        FROM
             people
             INNER JOIN orders ON (orders.pe_id = people.pe_id)
             INNER JOIN items ON items.pe_id = people.pe_id
        GROUP BY
             people.pe_id;
    

    이 도움이 스레드 주셔서 감사합니다 :)

  4. ==============================

    4.

    select pe_name,count( distinct b.ord_id),count(c.item_id) 
     from people  a, order1 as b ,item as c
     where a.pe_id=b.pe_id and
    b.ord_id=c.order_id   group by a.pe_id,pe_name
    
  5. ==============================

    5.귀하의 솔루션은 거의 정확합니다. 당신은 DISTINCT 추가 할 수 있습니다 :

    귀하의 솔루션은 거의 정확합니다. 당신은 DISTINCT 추가 할 수 있습니다 :

    SELECT
        people.pe_name,
        COUNT(distinct orders.ord_id) AS num_orders,
        COUNT(items.item_id) AS num_items
    FROM
        people
        INNER JOIN orders ON (orders.pe_id = people.pe_id)
        INNER JOIN items ON items.pe_id = people.pe_id
    GROUP BY
        people.pe_id;
    
  6. ==============================

    6.하나의 요구는이 가입을 이해하거나 조인의 일련의 데이터 집합에 않습니다. strae의 게시물, 1의 pe_id 당신에게에서 "선택"에 다음 데이터를 제공합니다 pe_id = 1에 질서와 항목을 해당과 결합 :

    하나의 요구는이 가입을 이해하거나 조인의 일련의 데이터 집합에 않습니다. strae의 게시물, 1의 pe_id 당신에게에서 "선택"에 다음 데이터를 제공합니다 pe_id = 1에 질서와 항목을 해당과 결합 :

    는 기본적으로 모든 테이블의 카티 제품과 함께 올 조인. 당신은 기본적으로 선택하는 데이터 세트가 있고 orders.ord_id 및 items.item_id에 고유 한 카운트를 필요로하는 이유입니다. 그렇지 않으면 둘 수는 2가 발생합니다 - 효과적으로 선택할 수 2 개 행이 있기 때문이다.

  7. from https://stackoverflow.com/questions/3141463/inner-join-with-count-on-three-tables by cc-by-sa and MIT license