2014-10-30 2 views
0

나는 세 가지 테이블, 즉 customer, client_assignment 및 customer_products를 가진다. 마지막 두 가지는 다 대 다 관계에 대한 대입 테이블입니다.MySQL 다중 조인 (many-to-many 관계)

client_assignment 유형이 client 인 고객은 다른 고객 (customer_id은 자식이고 client_id은 자식)과 연결됩니다.
고객의 제품과 고객을 연관 짓습니다.

클라이언트는 제품과 연결할 수 없으며 부모 고객으로부터 상속받습니다. 아래 예에서 그의 아버지 (Foo)가 가지고 있기 때문에 Foo-1에도 제품 3이 있다는 것을 의미합니다.

customer (Customers): 
+-------------+-------+----------+ 
| customer_id | name | type  | 
+-------------+-------+----------+ 
|   1 | Foo | customer | 
|   2 | Foo-1 | client | 
|   3 | Foo-2 | client | 
|   4 | Bar | customer | 
|   5 | Foob | customer | 
+-------------+-------+----------+ 

client_assignment (Customer/Client-Assignment): 
+-------------+-----------+ 
| customer_id | client_id | 
+-------------+-----------+ 
|   1 |   2 | 
|   1 |   3 | 
+-------------+-----------+ 

customer_product (Customer/Product-Assignment): 
+-------------+------------+ 
| customer_id | product_id | 
+-------------+------------+ 
|   1 |   3 | 
|   1 |   4 | 
|   1 |   5 | 
|   4 |   3 | 
|   5 |   7 | 
+-------------+------------+ 

나는 다음과 같은 작업을 수행 할 :

+-------------+-------+--------+ 
| customer_id | name | parent | 
+-------------+-------+--------+ 
|   1 | Foo | null | 
|   2 | Foo-1 | 1  | 
|   3 | Foo-2 | 1  | 
|   4 | Bar | null | 
+-------------+-------+--------+ 
: 모든 고객 제품 X.과 관련된 각각의 클라이언트

제품 3 내 원하는 결과이 같은 것입니다 선택

나는 이것에 대해 조금 생각해 왔으며 상당히 복잡해 보인다. 나는 다음과 같이 그들을 가입 시도했다 :

SELECT c2.customer_id, c2.name, c1.customer_id as parent 
    FROM customer_product p, customer c1, customer c2, client_assignment a 
WHERE 
      c1.customer_id = p.customer_id 
     AND c2.customer_id = a.client_id 
     AND a.customer_id = c1.customer_id 
     AND p.product_id = 3 

나는이 쿼리 나에게 정확하게 원하는 결과를주지 않을 것을 알고,하지만 난과 함께 시작을 만들었습니다. 그것에 관한 주요 문제는 고객 만 선택하는 것이지 고객 자체는 선택하지 않는다는 것입니다. 따라서 나는 단지 결과로 푸-1푸-2를 얻을 수 있지만 또는 .

질문 : 합리적으로 쉽게 달성 할 수 있습니까?

답변

2

당신은 스스로 고객을 얻는 또 다른 SELECT를 작성하고,이 UNION과는 결합 할 수 있습니다 :

SELECT c.customer_id, c.name, NULL AS parent 
    FROM customer AS c 
    JOIN customer_product AS p ON c.customer_id = p.customer_id 
WHERE c.type = 'customer' 
    AND p.product_id = 3 

UNION 

SELECT c2.customer_id, c2.name, c1.customer_id AS parent 
FROM customer_product AS p 
JOIN customer AS c1 ON c1.customer_id = p.customer_id 
JOIN client_assignment AS a ON a.customer_id = c1.customer_id 
JOIN customer AS c2 ON c2.customer_id = a.client_id 
WHERE c2.type = 'client' 
    AND p.product_id = 3 
+0

저는 'UNION'을 사용하는 것에 대해서 생각조차하지 않았습니다. 이것은 원했던 것처럼 정확하게 작동합니다. 고마워요! :) – Padarom

0

클라이언트 모두 고객의 이름과 부모를 얻을 필요가 있기 때문에, 일을하는 방법이 그것입니다 UNION을 사용합니다.

with customer_names as (select customer_id from s_customer_product where product_id =3), 

client_names as (select client_id , customer_id as Parent_id from s_client_assignment join customer_names using(customer_id)) 

select customer_id , name , null as Parent from s_customers join customer_names using(customer_id) 

union 

select a.client_id , b.name , a.parent_id as Parent from client_names a, s_customers b where b.customer_id = a.client_id;