具有三重连接的MySQL自我表更新

时间:2018-01-10 16:38:03

标签: mysql sql-update self

我有'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中甚至可以做到这一点吗?我搜索了自我加入但没有好的结果。

我尝试过这样的事情并没有奏效:

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重复,但在某些方面类似。它帮助我做出了正确的选择以达到我想要的效果(使用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列 - 我的'面包屑' - 第二列 - 第三个孩子的id(数字或NULL,因为有时父母只有一个孩子) - 第3栏 - 第二个孩子的身份证(号码) - 第4栏 - 第一个孩子的身份证(号码)

现在我正在考虑使用select的结果更新表格,但是现在我不知道如何执行此操作。

1 个答案:

答案 0 :(得分:0)

我已经设法做到了。解决方案如下。

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

我认为它涵盖了所有。这样或那样的方式很有效。