gpt4 book ai didi

mysql - 如何仅使用 MySQL 循环遍历表树

转载 作者:行者123 更新时间:2023-11-29 07:14:25 27 4
gpt4 key购买 nike

要知道的事情:

  • 我正在我们的报告软件中插入此声明,因此我没有机会使用 PHP 来为我执行循环。
  • 我对 MySQL 内部的 LOOP 子句不太熟悉,我之前做了一些研究,但可以在语法上使用一些帮助。

问题:

我将如何循环执行此 MySQL 语句? (声明如下)

以下语句现在有效,我还有更多CASE WHEN来添加它,但现在我正在尝试解决整个事情中最令人困惑的部分。

我需要循环遍历 MySQL 语句(或者找到另一种方法来编写相同的内容),直到到达树的底部。为了说明我正在尝试做的事情:

假设我需要从顶部开始获取整个树的下线。这意味着我必须为下面的每个人运行这个 MySQL 语句。

enter image description here

在我们当前的设置中,我将他们上面的人的 ID 存储在记录中,如下所示,为了沿着记录向下,我必须为其提供上线 ID 并返回所有具有该上线 ID 的记录,该 ID 会返回所有 IMMMEDIATE 下线。

+---------+-------------+------+
| ID | Upline ID | Name |
+---------+-------------+------+
| 745753 | 654-64645-3 | John |
| 098678 | 916-59172-1 | Jill |
| 543272 | 866-99573-8 | Fred |
| 634543 | 126-97939-3 | Dean |
| 923461 | 734-84628-5 | Bill |
| 861345 | 643-01957-0 | Cris |
+---------+-------------+------+

这意味着对于集合中返回的每一行,我必须分别沿着每个记录树跟踪 MySQL 语句,并对返回的每一行执行相同的操作,导致 MySQL 语句成倍增加,直到当我运行该语句时该记录没有返回任何内容,因此我到达了下线的末尾。

不用再等待,这里是语句(我在 WHERE 子句中给它顶部的第一个人的 ID 来启动语句):

    SELECT wn_writing_number_cstm.title_c, 
wn_writing_number.`name`,
preps_contracted_reps.first_name,
preps_contracted_reps.last_name,
cac_customize_agent_comp_cstm.commission_percentage_c,
wn_writing_number_cstm.id_c
FROM wn_writing_number
LEFT OUTER JOIN wn_writing_number_cac_customize_agent_comp_1_c ON wn_writing_number_cac_customize_agent_comp_1_c.wn_writing946b_number_ida = wn_writing_number.id
LEFT OUTER JOIN cac_customize_agent_comp ON wn_writing_number_cac_customize_agent_comp_1_c.wn_writing3148nt_comp_idb = cac_customize_agent_comp.id
LEFT OUTER JOIN cac_customize_agent_comp_cstm ON cac_customize_agent_comp.id = cac_customize_agent_comp_cstm.id_c
LEFT OUTER JOIN aos_products_cac_customize_agent_comp_1_c ON cac_customize_agent_comp_cstm.id_c = aos_products_cac_customize_agent_comp_1_c.aos_produca2b8nt_comp_idb
LEFT OUTER JOIN preps_contracted_reps_wn_writing_number_1_c ON preps_contracted_reps_wn_writing_number_1_c.preps_contracted_reps_wn_writing_number_1wn_writing_number_idb = wn_writing_number.id
LEFT OUTER JOIN preps_contracted_reps ON preps_contracted_reps_wn_writing_number_1_c.preps_cont9effed_reps_ida = preps_contracted_reps.id
LEFT OUTER JOIN wn_writing_number_cstm ON wn_writing_number_cstm.id_c = wn_writing_number.id
WHERE wn_writing_number_cstm.wn_writing_number_id_c = '53506bbe-008f-577c-2114-576b32e0ad11'

这里有一个查询生成器图来帮助说明此模型:

enter image description here

最后,这是该语句实际返回的内容,我需要再次运行该语句两次,每一行运行一次,其中包含我的 WHERE 中每条记录的 ID 子句:

+---------+-------------+------------+-------------------------------------+
| title_c | name | first_name | last_name | percent_c | id_c |
+---------+-------------+------------+-------------------------------------+
| A | MP-AB0682-16| Andrea | Donald | 10 | 823462345 |
| GA | RO-RM4619-16| Ronald | Yeller | 12 | 632811634 |
+---------+-------------+------------+-----------+-----------+-------------+

请评论以获取任何需要的进一步说明。谢谢!

最佳答案

一个半伪代码答案来阐明我的方法(抱歉,没有时间提供更精确的解决方案,并且不要频繁地使用语法来准确记住它而无需查找):

DECLARE lastInsertCount INT;
DECLARE lastLayer INT;
CREATE TABLE `temp`
(
`layer` int,
[fields you want and parent's identifier]
);

INSERT INTO `temp`(`layer`, fields you want...)
SELECT 0, fields you want...
FROM theTable
WHERE [is "root" result]
;
SET lastLayer := 0;

SET lastInsertCount := 1;
LayerLoop: WHILE lastInsertCount > 0

INSERT INTO `temp`(`layer`, fields you want...)
SELECT lastLayer + 1, fields you want...
FROM theTable
WHERE parent_id IN (SELECT id FROM `temp` WHERE layer = lastLayer)
;

SET lastInsertCount := ROW_COUNT();
SET lastLayer := lastLayer + 1;

END WHILE LayerLoop;

SELECT fields you want...
FROM `temp`
;

DROP TABLE `temp`;
<小时/>

编辑:如果您允许树中的“循环”,这将使其不是一棵树(但我不得不担心坏数据),您可以通过添加

AND id NOT IN (SELECT id FROM `temp`)

到 where 子句。

关于mysql - 如何仅使用 MySQL 循环遍历表树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38490133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com