[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.그것은 사람들과보다 주문과 아이템에 가입하는 것이 더 의미가 있습니다!
그것은 사람들과보다 주문과 아이템에 가입하는 것이 더 의미가 있습니다!
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.프랭크가 지적한 것처럼, 당신은 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.나는, 모두 별개의 퍼팅 시도 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.
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.귀하의 솔루션은 거의 정확합니다. 당신은 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.하나의 요구는이 가입을 이해하거나 조인의 일련의 데이터 집합에 않습니다. strae의 게시물, 1의 pe_id 당신에게에서 "선택"에 다음 데이터를 제공합니다 pe_id = 1에 질서와 항목을 해당과 결합 :
하나의 요구는이 가입을 이해하거나 조인의 일련의 데이터 집합에 않습니다. strae의 게시물, 1의 pe_id 당신에게에서 "선택"에 다음 데이터를 제공합니다 pe_id = 1에 질서와 항목을 해당과 결합 :
는 기본적으로 모든 테이블의 카티 제품과 함께 올 조인. 당신은 기본적으로 선택하는 데이터 세트가 있고 orders.ord_id 및 items.item_id에 고유 한 카운트를 필요로하는 이유입니다. 그렇지 않으면 둘 수는 2가 발생합니다 - 효과적으로 선택할 수 2 개 행이 있기 때문이다.
from https://stackoverflow.com/questions/3141463/inner-join-with-count-on-three-tables by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의에서 사용할 수있는 병합 문입니다 (0) | 2020.06.30 |
---|---|
[SQL] 다른 부분에 하나는 유사하다 열 비교 (0) | 2020.06.30 |
[SQL] 어떻게 다른 테이블을 업데이트하는 업데이트 트리거를 사용 하는가? (0) | 2020.06.30 |
[SQL] CLOB에 SUBSTR의 성능 (0) | 2020.06.29 |
[SQL] 협회가 존재하지 않는다면 확인 범위를 레일 (0) | 2020.06.29 |