mysql - 我可以在任意数量的连接的顶层有一个 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——但是有没有办法做到这一点?
解决方案
推荐阅读
- azure - Oracle ADW 到 Snowflake 数据的迁移
- c++ - C++ Primer 第 5 版联合和类类型成员
- c# - 在一行中实例化一个对象
- amazon-web-services - 长轮询 AWS SQS 队列是否保证来自单个消息组的消息?
- java - UrlDecoder getParameter 无法解码包含“%”的密码
- javascript - 自动生成新的分区并标记它
- hibernate - Spring Data - 如何将 YearMonth 类型的 @Param 转换为 LocalDate 的开始和结束?
- sql - 转换表格数据并重新格式化
- django - 我无法让这个外键表值显示在 django 模板中
- aws-sdk - 无法通过 sdk 创建节点组