MYSQL-在嵌套模型集中查找所有父\u id

MYSQL-在嵌套模型集中查找所有父\u id,mysql,Mysql,MYSQL版本:5.7.33 我基于以下内容实现了嵌套集模型概念: 以下是数据: +----+------+------+------+------+-------------------------------------+--------+------------------+ | id | lft | rgt | lvl | root | name | code | header_or_detail | +----+-

MYSQL版本:5.7.33

我基于以下内容实现了嵌套集模型概念:

以下是数据:

+----+------+------+------+------+-------------------------------------+--------+------------------+
| id | lft  | rgt  | lvl  | root | name                                | code   | header_or_detail |
+----+------+------+------+------+-------------------------------------+--------+------------------+
|  1 |    1 | 2761 |    0 |    1 | AKTIVA                              | 1      |                0 |
|  2 |    2 | 2281 |    1 |    1 |     AKTIVA LANCAR                   | 11     |                0 |
|  3 |    3 |   62 |    2 |    1 |         KAS TUNAI                   | 1101   |                0 |
|  4 |    4 |    5 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
|  5 |    6 |    7 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
|  6 |    8 |    9 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
|  7 |   10 |   11 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
|  8 |   12 |   13 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
|  9 |   14 |   15 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
| 10 |   16 |   17 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
| 11 |   18 |   19 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
| 12 |   20 |   21 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
| 13 |   22 |   23 |    3 |    1 |             Kas Kecil Rupiah        | 110101 |                1 |
| 14 |   24 |   25 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 15 |   26 |   27 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 16 |   28 |   29 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 17 |   30 |   31 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 18 |   32 |   33 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 19 |   34 |   35 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 20 |   36 |   37 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 21 |   38 |   39 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 22 |   40 |   41 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 23 |   42 |   43 |    3 |    1 |             Kas Tunai USD           | 110102 |                1 |
| 24 |   44 |   45 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 25 |   46 |   47 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 26 |   48 |   49 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 27 |   50 |   51 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 28 |   52 |   53 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 29 |   54 |   55 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 30 |   56 |   57 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 31 |   58 |   59 |    3 |    1 |             Kas Tunai Dibrankas     | 110103 |                1 |
| 32 |   60 |   61 |    3 |    1 |             Kas Tunai USD (EL)      | 110104 |                1 |
| 33 |   63 |  216 |    2 |    1 |         KAS DI BANK                 | 1102   |                0 |
| 34 |   64 |   65 |    3 |    1 |             Bank BCA-GMD RPH TS     | 110201 |                1 |
| 35 |   66 |   67 |    3 |    1 |             Bank BCA-VETERAN RPH TS | 110201 |                1 |
| 36 |   68 |   69 |    3 |    1 |             Bank BCA-PEMUDA RPH TS  | 110201 |                1 |
+----+------+------+------+------+-------------------------------------+--------+------------------+
36 rows in set (0.01 sec)


我的目标是,我希望每个记录都有一个父id列。 这里我只显示36行,但在实际数据库中有1374行

我正在使用一个查询,使用一个带有子查询的查询来获取父\u id,如下所示

SELECT COALESCE((
SELECT GROUP_CONCAT(DISTINCT parent.id)
FROM chart_of_account AS parent
WHERE ((parent.lft < (node.lft)) AND (parent.rgt > (node.rgt))) AND (parent.root = node.root)
GROUP BY parent.root            ), node.root) AS parent_id  , 
    node.id
    , node.lft
    , node.rgt
    , node.lvl
    , node.root
    , CONCAT(REPEAT(' ', `node`.lvl * 4), `node`.name) AS name
    , node.code
    , node.header_or_detail
FROM chart_of_account AS node
WHERE root = 1
ORDER BY root, lft

如果使用子查询,则获取1.374行需要4.2秒。 还有别的办法吗

以下是解释:

Plain Text Explain

+----+--------------------+--------+------+---------------+-----+---------+-----+------+-------+
| id | select_type        | table  | type | possible_keys | key | key_len | ref | rows | extra |
+----+--------------------+--------+------+---------------+-----+---------+-----+------+-------+
|  1 | PRIMARY            | node   |      | ALL           |     |         |     |      | 5598  |
|  2 | DEPENDENT SUBQUERY | parent |      | ALL           |     |         |     |      | 5598  |
+----+--------------------+--------+------+---------------+-----+---------+-----+------+-------+

我实现了嵌套集模型的概念,为什么这样做?目标是什么?你真的需要嵌套集合吗?也许完全限定的节点路径更有用?对于Akina,请参阅复式簿记会计系统中的科目表:您必须在根、lft和rgt上创建一个索引。那么你的查询速度就更快了
Plain Text Explain

+----+--------------------+--------+------+---------------+-----+---------+-----+------+-------+
| id | select_type        | table  | type | possible_keys | key | key_len | ref | rows | extra |
+----+--------------------+--------+------+---------------+-----+---------+-----+------+-------+
|  1 | PRIMARY            | node   |      | ALL           |     |         |     |      | 5598  |
|  2 | DEPENDENT SUBQUERY | parent |      | ALL           |     |         |     |      | 5598  |
+----+--------------------+--------+------+---------------+-----+---------+-----+------+-------+