有一张桌子
编辑:由于id和field_id相同,因此上一张表不清楚 这就是你们下面给出的解决方案不起作用的原因。
存储的parent_id不是field_id,而是自动生成的ID。
因此,在这种情况下,必须考虑所有3列。
在其他情况下,field_id实际上用于构造sql。
但是在这种情况下,表的ID存储为parent_id,而不是field_id。
-------------------------
id | field_id | parent_id |
---------------------------
1 10 0
2 11 1
3 12 1
4 13 2
5 14 2
6 15 2
7 16 2
8 17 4
我有此表,其中存在field_id和parent_ids。 我需要得到所有的field_id以及他们的所有子孙。
所以我在下面的stackoverflow上找到了这段代码。但是不能像使用旧版本的即时消息那样在mysql中使用它,而且在我的情况下也有所不同。 (使用3列而不是2列)
我的mysql版本不支持。
我们如何不使用WITH语句来重写查询。
谢谢。
DECLARE @Id int = your_UnitId
;WITH cte AS
(
SELECT a.Id, a.parentId, a.name
FROM customer a
WHERE Id = @Id
UNION ALL
SELECT a.Id, a.parentid, a.Name
FROM customer a JOIN cte c ON a.parentId = c.id
)
SELECT parentId, Id, name
FROM cte
答案 0 :(得分:0)
如果有一种方法可以重新设计这些表,建议您看一下嵌套集模型(Joe Celko)。否则,像这样的表会变得很混乱,因为它们自身的联接很复杂……但是,如果您必须知道要获取子代和子代的查询,则它只是一系列联合语句:
注意:My mySql有点生锈,因此您可能需要稍微更改一下语法才能使它工作。
SELECT
id,
field_id,
NULL AS parent_id,
NULL AS grandparent_id,
0 AS level_depth
FROM
customer
WHERE
parent_id = 0
UNION
SELECT
child.id,
parent.id AS parent_id,
NULL AS grandparent_id,
child.field_id,
1 AS level_depth
FROM
customer AS parent
JOIN customer AS child
ON child.parent_id = parent.id
WHERE
parent.parent_id = 0
UNION
SELECT
child.id,
child.field_id,
parent.id AS parent_id,
grandparent.id AS grandparent_id,
2 AS level_depth
FROM
customer AS grandparent
JOIN customer AS parent
ON parent.parent_id = grandparent.id
JOIN customer AS child
ON child.parent_id = parent.id
WHERE
grandparent.id = 0