mysql三重连接自表更新

9fkzdhlc  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(322)

我有类似这样的“分类”表

| 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,我不认为我的问题与如何创建mysql分层递归查询重复,但在某种程度上类似。它帮助我做出正确的选择来实现我想要的(在mysql中使用管理分层数据)。
选择代码:

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列-我的“面包屑”-第2列-第三个孩子的id(数字或null,因为有时有父母,只有一个孩子)-第3列-第二个孩子的id(数字)-第4列-第一个孩子的id(数字)
现在我在考虑用select的结果更新表,但现在我不知道如何执行这个操作。

zlhcx6iw

zlhcx6iw1#

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

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

我想它涵盖了所有的东西。不管怎样,这都很好。

相关问题