我使用MySQL/MariaDB数据库。我不能使用这个过程,因为我没有权限,我想从一个子元素中选择没有上父元素的上父元素。
例子:
Familly > CMP > ACC
我选择ACC子节点,我想要顶部父节点,在本例中是family。
.
Familly > CMP > Numeric > CFRA
我选择了CFRA子节点,我想要顶层父节点,在本例中是family。
这是我的表:
create table llx_categorie
(
rowid int auto_increment primary key,
entity int default 1 not null,
fk_parent int default 0 not null,
label varchar(255) not null,
type tinyint default 1 not null,
description text null,
);
这是我想看到的:
child_label top_parrent_label
ACC Familly
这就是我所尝试的:
SELECT rowid, label
FROM llx_categorie m
WHERE rowid=170
UNION ALL
SELECT m.rowid, m.label
FROM llx_categorie m
INNER JOIN llx_categorie p
ON p.rowid = m.fk_parent
但是返回每个兄弟节点。
您正在查找从自连接连接到任何父记录的所有子记录。使用where子句将自连接的结果限制为仅为父节点:
SELECT c.*, parent.*
FROM llx_categorie c
INNER JOIN llx_categorie parent on c.fk_parent = parent.rowid
WHERE parent.fk_parent is null
对于您的实例,您需要将条件更改为等于0而不是null,因为您的列不是空的。我没有在上面的SQL中说明这一点,因为在默认情况下,引用本文的任何访问者都不应该连接到0记录。强烈不建议使用这种模式范式。外键约束将尝试在外键内强制执行该0值。这可能会降低自连接的性能,当0记录不存在时可能会导致外键错误,并且会使新开发人员感到困惑,因为他们希望外键为空,而没有关联的行。