MySQL self table 使用三重连接更新
MySQL self table update with triple join
我有 table 'CATEGORY' 这样的东西
| NUMBER | NAME | TITLE | UP_CATEGORY |
-------------------------------------
| 1 | AAA | | 0 |
-------------------------------------
| 2 | BBB | | 0 |
-------------------------------------
| 3 | CCC | | 1 |
-------------------------------------
| 4 | DDD | | 2 |
-------------------------------------
| 5 | EEE | | 3 |
-------------------------------------
我想在网页导航中有类似面包屑的标题(主页 > 类别 1 > 类别 2)。
在这种情况下,标题应如下所示:
AAA = AAA
BBB = BBB
CCC = CCC :: AAA
DDD = DDD :: BBB
EEE = EEE :: CCC :: AAA
在纯 MySQL 中甚至可以做到这一点吗?我搜索了 self join 但没有很好的结果。
我试过类似的方法但没有成功:
UPDATE t1 SET t1.title = t2.name
FROM category t1, category t2 WHERE t2.up_category = t1.number
我是否正在以良好的方式实现我想要的目标?
编辑:
@Alex,我不认为我的问题与 How to create a MySQL hierarchical recursive query, but in some way similar. It helped me with making a proper select to achieve what I want (using Managing Hierarchical Data in MySQL) 重复。
SELECT的代码:
SELECT CONCAT_WS(" :: ",t3.name,t2.name,t1.name), t3.number, t2.number, t1.number
FROM category AS t1
LEFT JOIN category AS t2 ON t2.up_category = t1.number
LEFT JOIN category AS t3 ON t3.up_category = t2.number
WHERE t1.up_category = 0
所以我现在有一个包含 4 列的结果
- 第 1 栏 - 我的专栏 'breadcrumbs'
- 第二列 - 第三个 child 的 id(数字或 NULL,因为有时有 parent 而只有一个 child)
- 第 3 列 - 第二个 child 的 ID(数字)
- 第 4 列 - 第一个 child 的 ID(数字)
现在我正在考虑用 select 的结果更新 table,但现在我不知道如何执行此操作。
我已经做到了。解决方案如下。
UPDATE category table1,
(
SELECT CONCAT_WS(" :: ",t3.name,t2.name,t1.name) AS title, IF(t3.number IS NOT NULL,t3.number,IF(t2.number IS NOT NULL,t2.number,t1.number)) AS id_cat
FROM category AS t1
RIGHT JOIN category AS t2 ON t2.up_category = t1.number
RIGHT JOIN category AS t3 ON t3.up_category = t2.number
) table2
SET table.title = table2.new_title
WHERE table1.number = table2.id_cat
我认为它涵盖了所有内容。一种或另一种方式有效,所以它很好。
我有 table 'CATEGORY' 这样的东西
| NUMBER | NAME | TITLE | UP_CATEGORY |
-------------------------------------
| 1 | AAA | | 0 |
-------------------------------------
| 2 | BBB | | 0 |
-------------------------------------
| 3 | CCC | | 1 |
-------------------------------------
| 4 | DDD | | 2 |
-------------------------------------
| 5 | EEE | | 3 |
-------------------------------------
我想在网页导航中有类似面包屑的标题(主页 > 类别 1 > 类别 2)。 在这种情况下,标题应如下所示:
AAA = AAA
BBB = BBB
CCC = CCC :: AAA
DDD = DDD :: BBB
EEE = EEE :: CCC :: AAA
在纯 MySQL 中甚至可以做到这一点吗?我搜索了 self join 但没有很好的结果。
我试过类似的方法但没有成功:
UPDATE t1 SET t1.title = t2.name
FROM category t1, category t2 WHERE t2.up_category = t1.number
我是否正在以良好的方式实现我想要的目标?
编辑:
@Alex,我不认为我的问题与 How to create a MySQL hierarchical recursive query, but in some way similar. It helped me with making a proper select to achieve what I want (using Managing Hierarchical Data in MySQL) 重复。
SELECT的代码:
SELECT CONCAT_WS(" :: ",t3.name,t2.name,t1.name), t3.number, t2.number, t1.number
FROM category AS t1
LEFT JOIN category AS t2 ON t2.up_category = t1.number
LEFT JOIN category AS t3 ON t3.up_category = t2.number
WHERE t1.up_category = 0
所以我现在有一个包含 4 列的结果 - 第 1 栏 - 我的专栏 'breadcrumbs' - 第二列 - 第三个 child 的 id(数字或 NULL,因为有时有 parent 而只有一个 child) - 第 3 列 - 第二个 child 的 ID(数字) - 第 4 列 - 第一个 child 的 ID(数字)
现在我正在考虑用 select 的结果更新 table,但现在我不知道如何执行此操作。
我已经做到了。解决方案如下。
UPDATE category table1,
(
SELECT CONCAT_WS(" :: ",t3.name,t2.name,t1.name) AS title, IF(t3.number IS NOT NULL,t3.number,IF(t2.number IS NOT NULL,t2.number,t1.number)) AS id_cat
FROM category AS t1
RIGHT JOIN category AS t2 ON t2.up_category = t1.number
RIGHT JOIN category AS t3 ON t3.up_category = t2.number
) table2
SET table.title = table2.new_title
WHERE table1.number = table2.id_cat
我认为它涵盖了所有内容。一种或另一种方式有效,所以它很好。