繁体   English   中英

MySQL多重连接具有多对多关系

[英]MySQL multiple joins with Many-To-Many relations

我有三个对我来说很重要的表:customer,client_assignment和customer_products。 最后两个是多对多关系的分配表。

在client_assignment中,类型为client与另一个客户相关联(其中customer_id是父级, client_id是子级)。
在customer_product中,我将客户与产品相关联。

客户无法与产品相关联,他从其父客户那里继承了该产品。 在下面的示例中,这意味着Foo-1也具有乘积3,因为他的父亲( Foo )具有乘积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 |
+-------------+------------+

我要实现以下目标:选择与产品X相关联的所有客户他们各自的客户

我对产品3的期望结果是这样的:

+-------------+-------+--------+
| customer_id | name  | parent |
+-------------+-------+--------+
|           1 | Foo   | null   |
|           2 | Foo-1 | 1      |
|           3 | Foo-2 | 1      |
|           4 | Bar   | null   |
+-------------+-------+--------+

我已经考虑了一下,它似乎相当复杂。 我曾尝试像下面这样加入他们:

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

我知道,这个查询不会给我确切想要的结果,但是我已经创建了它。 它的主要问题是,它仅选择客户,而不选择客户本身。 因此,结果只能得到Foo-1Foo-2 ,而不能得到BarFoo

问题是:这是否合理容易实现?如何实现?

您可以编写另一个让客户自己获取的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

因为必须同时获得客户和客户父母的姓名,所以一种方法是使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM