在MySQL8.0及更高版本中,可以使用递归CTE遍历层次结构。但是,由于您的客户已经拥有他们分配的公司的一些母公司(我觉得有点奇怪),这将导致重复。所以你需要得到不同的集合。为了方便起见,我使用了另一个CTE,但您也可以跳过它并执行
DISTINCT
直接在您的查询中。然后,您可以从CTE简单地查询客户的公司。
WITH RECURSIVE
cte1 AS
(
SELECT cu.customer_id,
cu.company_id
FROM customer cu
UNION ALL
SELECT ct.customer_id,
co.parent_id company_id
FROM cte1 ct
INNER JOIN company co
ON ct.company_id = co.company_id
WHERE co.parent_id IS NOT NULL
),
cte2 AS
(
SELECT DISTINCT
ct.customer_id,
ct.company_id
FROM cte1 ct
)
SELECT company_id
FROM cte2
WHERE customer_id = 2;
DB Fiddle
当然,您也可以将客户ID上的条件转移到递归CTE的锚中。如果您只需要为一个客户提供这个服务,那么这可能会降低查询的成本。