MySQL查询父子级关系的SQL语句(mysql 上下级sql)
MySQL查询父子级关系的SQL语句
在实际开发中,经常遇到要查询父子级关系的数据,比如一个商品分类的树形结构等。MySQL可以通过递归查询、连接查询等方式来实现。
一、递归查询方法
递归查询是指在查询语句的WHERE条件中使用自身来实现查询。通过递归查询,可以获取某个节点的所有子节点。
例如,现在有一个商品分类表,表结构如下:
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '分类名称',
`parent_id` int(11) DEFAULT '0' COMMENT '父分类ID', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表';
其中,parent_id为分类的父级ID,为0表示该分类为根节点。现在要查询ID为1的分类的所有子分类,可以使用以下SQL语句(使用递归查询):
WITH RECURSIVE category_tree AS (
SELECT * FROM category WHERE id = 1 UNION ALL
SELECT c.* FROM category c JOIN category_tree ct ON c.parent_id = ct.id
)SELECT * FROM category_tree;
上述SQL语句中,使用了WITH RECURSIVE关键字来声明公共表达式,然后在SELECT语句中使用UNION ALL和JOIN操作来实现递归查询。
二、连接查询方法
连接查询是指通过多次连接同一张表,来获取父子级关系的数据。连接查询的缺点是效率低下,但对于数据量较小的场景,使用连接查询也是一种可行的方法。
以商品分类为例,使用连接查询可以获得任意两个分类之间的关系,以下是使用连接查询获取ID为1的分类的所有子分类的SQL语句:
SELECT c1.*, c2.parent_id as parent_2, c3.parent_id as parent_3, c4.parent_id as parent_4
FROM category c1LEFT JOIN category c2 ON c1.id = c2.parent_id
LEFT JOIN category c3 ON c2.id = c3.parent_idLEFT JOIN category c4 ON c3.id = c4.parent_id
WHERE c1.id = 1;
上述SQL语句中,使用了多次LEFT JOIN操作,将同一张表连接了四次,通过查询结果中每个分类的parent_id来确定其父节点,从而获取父子级关系数据。
三、总结
在实现父子级关系数据查询时,递归查询和连接查询都有各自的优缺点。递归查询效率高,但只能获取某个节点下面的所有子节点;连接查询效率低,但可以获取任意两节点之间的关系,根据实际需求使用不同的方法进行查询。