在较早版本的mysql中,我们可以用于WITH语句的替代方法是什么?

时间:2019-07-16 14:02:11

标签: mysql sql join

有一张桌子

编辑:由于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

1 个答案:

答案 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