mysql - 简单 MySQL 递归上的 Union

标签 mysql sql recursion union

有没有办法在 LEFT JOIN 行之间进行 UNION,以便结果不在单独的列(lev1、lev2、lev3 和 lev4)中,而是在单个列中(即“ItemNo”)?

这是 MySQL 查询:

SELECT t1.ItemID AS lev1, t2.ItemID as lev2, t3.ItemID as lev3, t4.ItemID as lev4
FROM TableOfRelations AS t1
LEFT JOIN TableOfRelations AS t2 ON t2.ParentItemID = t1.ItemID
LEFT JOIN TableOfRelations AS t3 ON t3.ParentItemID = t2.ItemID
LEFT JOIN TableOfRelations AS t4 ON t4.ParentItemID = t3.ItemID
WHERE t1.ParentItemID = (SELECT ID FROM TableOfItems WHERE ItemID = 3599);

编辑: 这是我正在寻找的结果示例:

ItemID   ParentItemID   JoinedDescription1      JoinedDescription2
  3599      NULL        MyString1A              MyString1B
  35        3599       MyString35A             MyString35B
  168       3599        MyString168A            MyString168B
  192       168         MyString192A            MyString192B
  238       3599        MyString238A            MyString238B
  266       168         MyString266A            MyString266B

此结果将用于使用 VB.NET 填充 TreeView。此外,“JoinedDescriptions”尚未根据 ItemID 从不同的表中连接,但我认为一旦正确获得基本表,我就可以轻松处理该问题。 重要提示:这些选定的行仅属于一个项目(本例中的根项目“3599”),这意味着它只是数千行中的几行。一些递归示例假定所有表行都在查询中使用,这不是我的情况。

最佳答案

不,实际上没有办法在 LEFT JOIN 操作之间进行 UNION。

但是,您可以通过将查询转换为内联 View ,使用查询的结果集来获取所需的结果。

这是一种方法:

SELECT u.i AS lev
     , CASE u.i
       WHEN 1 THEN t.lev1
       WHEN 2 THEN t.lev2
       WHEN 3 THEN t.lev3
       WHEN 4 THEN t.lev4
       END AS levItemID
  FROM ( SELECT 1 AS i
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
       ) u
 CROSS
  JOIN ( SELECT t1.ItemID AS lev1
              , t2.ItemID AS lev2
              , t3.ItemID AS lev3
              , t4.ItemID AS lev4
           FROM TableOfItems t0
           JOIN TableOfRelations t1
             ON t1.ParentItemID = t0.id
           LEFT
           JOIN TableOfRelations t2
             ON t2.ParentItemID = t1.ItemID
           LEFT
           JOIN TableOfRelations t3
             ON t3.ParentItemID = t2.ItemID
           LEFT
           JOIN TableOfRelations t4
             ON t4.ParentItemID = t3.ItemID
          WHERE t0.ItemID = 3599
       ) t

注意:这实际上更像是一个 UNION ALL 操作,它不会删除重复项,它返回 NULL 值,并且返回父级的级别。

您可以调整查询以获得您想要的结果。如果您不关心级别编号,请从 SELECT 列表中删除 u.i

要删除重复项,您可以在 SELECT 后面添加 DISTINCT 关键字,或添加 GROUP BY 子句。要消除 NULL 值,您可以添加 HAVING levItemID IS NOT NULL 子句等。

关于mysql - 简单 MySQL 递归上的 Union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22789099/

相关文章:

mysql - 从 ssh 运行 mysql & 查询语句在 SELECT 语句中有一个需要引号的文本 header ?

mysql - SQL 内联 IF 语句显示列名和字符串

sql - MS SQL Server 2005 - 存储过程 "Spontaneously Breaks"

recursion - Lisp - 拆分递归

java - 遍历n维空间

php - 仅使用 Facebook 社交登录 + php/mysql

mysql - 我想将特定间隔的日期分为10部分,并在mysql中查询每个部分的计数

mysql - 启用远程MySQL连接: ERROR 1045 (28000): Access denied for user

sql - 我如何连接到 ODBC Oracle 数据库?

javascript - 在 typescript 中遍历可变元组