MySQL 是一种流行的关系型数据库管理系统。它具有许多功能,其中之一是父子关系表查询。父子关系表在数据库设计中很常见,因为它们可以用于构建层次结构。
CREATE TABLE `category` (`id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`name` varchar(255) NOT NULL,PRIMARY KEY (`id`),KEY `parent_id` (`parent_id`),CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `category` (`id`, `parent_id`, `name`)VALUES(1, NULL, '手机'),(2, 1, '智能手机'),(3, 1, '老人手机'),(4, 2, '华为手机'),(5, 2, '小米手机'),(6, 2, '苹果手机');
在这个示例中,我们建立了一个叫做 "category" 的表,它包含三个列: "id", "parent_id" 和 "name"。
"id" 列用于标识每个分类的唯一性。
"parent_id" 列用于表示该分类的父级分类。如果该分类是根分类,则该列的值为 NULL。
"name" 列用于存储分类名称。
下面是一个查询语句,它能够返回所有分类以及它们的子分类:
SELECTc1.name AS level1,c2.name AS level2,c3.name AS level3FROMcategory AS c1LEFT JOIN category AS c2 ON c2.parent_id = c1.idLEFT JOIN category AS c3 ON c3.parent_id = c2.idWHEREc1.parent_id IS NULL;
这个查询使用LEFT JOIN
来连接 "category" 表三次,每个连接都连接到同一个表,但是使用不同的表别名。
第一次连接将 "c1" 表连接到 "category" 表,用于获取根级分类 "level1"。
第二次连接将 "c2" 表连接到 "category" 表,用于获取 "level2" 的子类别,这些子类别的父级分类被设置为 "level1" 的 "id"。
第三次连接将 "c3" 表连接到 "category" 表,用于获取 "level3" 的子类别,这些子类别的父级分类被设置为 "level2" 的 "id"。
最后,查询使用WHERE
子句限制了只返回根级别分类。我们通过检查 "c1.parent_id" 是否为 NULL 来判断这点。