如何从自引用表中的节点获取没有父节点的第一个节点



我使用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记录不存在时可能会导致外键错误,并且会使新开发人员感到困惑,因为他们希望外键为空,而没有关联的行。

最新更新