首页 > 解决方案 > 我可以在任意数量的连接的顶层有一个 WHERE 条件吗?

问题描述

我的数据库中有一个表,看起来像这样:

CREATE TABLE locations (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255),
  group_id BIGINT,
  type VARCHAR(255)
  FOREIGN KEY (group_id) REFERENCES locations(id)
);

换句话说,位置的层次结构。每个位置都是一个组 ( type = 'group') 或一个常规位置 ( type IS NULL)。组和常规位置都可以属于“父”组,由 引用group_id。只有团体可以作为父母;常规位置不能。因此,鉴于这些记录:

INSERT INTO locations (id, name, group_id, type) VALUES
  (1, 'Top-level 1', NULL, 'group'),
  (2, 'Mid-level', 1, 'group'),
  (3, 'Location 1', 2, NULL),
  (4, 'Location 2', 2, NULL),
  (5, 'Location 3', 1, NULL),
  (6, 'Top-level 2', NULL, 'group'),
  (7, 'Location 4', 6, NULL);

我想查询其父链中任何位置具有“顶级 1”的位置。记录 ID 3、4 和 5 应返回;7不应该。

如果这只是一个可选的父级,这很容易:一个INNER JOIN. 我面临的问题是结构可以有任意数量的父母:这个例子有两个父母级别,但它可以是任何东西。我还需要与非顶级父母合作的解决方案 - 如果我改为查询其父链中具有“中级”的位置,那也需要工作。

我有点期待答案是否定的——或者至少肯定不是 JOIN 和 WHERE——但是有没有办法做到这一点?

标签: mysqljoinwhere

解决方案


推荐阅读