【问题标题】:MySQL getting data + recursive queryMySQL获取数据+递归查询
【发布时间】:2015-10-21 12:07:07
【问题描述】:

我有 3 张桌子:

+-----+----------+   +-----+----------+-------+  +-----+----------+-------+
| id  |   A_id   |   | A_id|   B_id   | value |  | B_id|   B_id_  | value |
+-----+----------+   +-----+----------+-------+  +-----+----------+-------+
|    1|         5|   |    5|         1|     aa|  |    1|         2|   zzxx|
+-----+----------+   +-----+----------+-------+  +-----+----------+-------+
|    2|         3|   |    3|         3|     bb|  |    2|          |   vvyy|
+-----+----------+   +-----+----------+-------+  +-----+----------+-------+
                                                 |    3|         4|   bbll|
                                                 +-----+----------+-------+
                                                 |    5|          |   oopp|
                                                 +-----+----------+-------+
                                                 |    4|         5|   mmnn|
                                                 +-----+----------+-------+

我需要使用什么 SELECT 语句,以便输出看起来像这样(table3 可以深入到它自身的 4 个级别):

+----+------------------------------+
| id |                        value |
+----+------------------------------+
|   1|                  aa\zzxx\vvyy|
+----+------------------------------+
|   2|             bb\bbll\mmnn\oopp|
+----+------------------------------+

由于我对 DB 和 SQL 没有太多经验,这对我来说很难。而且我对如何做到这一点没有任何远见。

这必须在 MySQL 中完成。 我读过的最难的事情是 MySQL 中的递归查询,因为它不存在,所以人们必须模拟它。我已经阅读了一些关于递归查询的 SO 主题,但我知道那不适合我。

感谢任何帮助。

【问题讨论】:

  • 这是某种反向练习,猜猜查询?为什么不告诉我们这些结果的条件是什么?
  • table2和table3有关系吗?
  • 除标点符号外,您在同一个表中有两列称为 b_id。你不认为这会给问题增加不必要的复杂性和混乱吗?
  • 我想我已经展示过了。它是第二张表中的 collum B_id (foreign_key),这是第三张表的主键
  • @Strawberry 它被称为B_id_,所以人们可以理解这是第三张表的键,但该列的名称不同

标签: mysql sql recursion


【解决方案1】:

通过刻苦学习,我设法解决了我的问题。代码如下。

SELECT DISTINCT
    OTHER.DATA,
    concat(
        '/',ifnull(t4.value,''), CASE WHEN (t4.value is NULL) then '' else '/' END,  
        ifnull(t3.value,''), CASE WHEN (t3.value is NULL) then '' else '/' END,  
        ifnull(t2.value,''), CASE WHEN (t2.value is NULL) then '' else '/' END, 
        ifnull(t1.value,''), CASE WHEN (t1.value is NULL) then '' else '/' END, 
        table2.value
    ) as 'My Column name'

FROM
    table1

LEFT JOIN table2 ON 
    (table1.A_id = table2.A_id)

LEFT JOIN table3 as t1 ON
    (t1.B_id = table2.B_id)

LEFT JOIN table3 AS t2 ON 
    (t2.B_id = t1.B_id_) 

LEFT JOIN table3 AS t3 ON 
    (t3.B_id = t2.B_id_)

LEFT JOIN table3 AS t4 ON 
    (t4.B_id = t3.B_id_)

非常感谢@Damodaran 和他的递归查询解决方案。 How to create a MySQL hierarchical recursive query

请谨慎使用此代码,因为我已将它用于 DB,它仅用于查询数据。所以这种方法在其他不同的用法上可能会很慢。如果你使用这个,我建议你考虑索引一些字段。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2023-03-12
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2019-05-14
    • 2012-02-16
    • 2020-07-29
    相关资源
    最近更新 更多