【问题标题】:How to get the first node that has no parent from a node in a self-referencing table如何从自引用表中的节点获取第一个没有父节点的节点
【发布时间】:2021-01-18 23:36:33
【问题描述】:

我正在使用 MySQL / MariaDB 数据库。我无法使用该程序,因为我没有权限,我想从其中一个孩子中选择没有上父母的最高父母。

例子:

Familly > CMP > ACC

我选择了 ACC 孩子,我想要在这种情况下是家庭的顶级父母。

.

Familly > CMP > Numeric > CFRA

我选择了 CFRA 孩子,我想要在这种情况下是家庭的最高父母。

这是我的桌子:

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

但这会返回每个兄弟节点。

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    您正在查找通过自联接连接到任何父记录的所有子记录。使用 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,因为您的列不为 null。我不是在上面的 SQL 中说明这一点,因为任何引用本文的访问者默认不应该连接到 0 记录。强烈不建议使用该模式范式。外键约束将尝试在您的外键中强制执行该 0 值。这可能会降低自连接的性能,当不存在 0 记录时可能会导致外键错误,并且会使新开发人员感到困惑,因为他们会期望没有关联行的外键为空。

    【讨论】:

    • 家庭 CMP 和 ACC 不是同一个表中的不同表:llx_categorie。 ACC 在 fk_parrent 上有 CMP cmp 的 rowid,在 fk_parrent 上有 Family 的 rowid。我的问题是我想在 fk_parrent 键不为空时加入表本身
    • 我提出了一个额外的建议,但目标仍然很模糊。架构不允许您拥有没有父级的记录。
    • rowid 是我的主键,所以不能为空,但是 fk_parrent 可以为空。当它为空时,这意味着它是第一个节点元素。此请求(您的修改):SELECT c.label, parent.label FROM llx_categorie c LEFT JOIN llx_categorie parent on c.fk_parent = parent.rowid WHERE parent.fk_parent = 0 有效,但我只有一个父节点的子节点
    • 您声明 fk_parrent 不能为空:" fk_parent int default 0 not null,"
    • 是的,但是当它为 0 时,就像他们没有上级父母一样
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多