MySQL8 递归查询 正确用法
千万不能被CSDN、博客园这类垃圾网站误导,全是互相抄袭的错误代码。
又一次经过半天反复测试,自己找到了正确的用法,之前卡住的程序可以继续写了……
测试表:
CREATE TABLE `city` (
`t1` int(11) NOT NULL,
`t2` int(11) NOT NULL,
`tt` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `city` (`t1`, `t2`, `tt`) VALUES
(1, 2, 3),
(3, 4, 5),
(5, 6, 7),
(7, 8, 9);
查询句:
WITH RECURSIVE temp AS (
SELECT * FROM city WHERE t1=1 AND t2=2
UNION ALL
SELECT city.* FROM city INNER JOIN temp WHERE city.t1=temp.tt AND city.t2=4
UNION ALL
SELECT city.* FROM city INNER JOIN temp WHERE city.t1=temp.tt AND city.t2=6
UNION ALL
SELECT city.* FROM city INNER JOIN temp WHERE city.t1=temp.tt AND city.t2=8
)
SELECT * FROM temp;
易错点:
1. WITH 后面必须添加 RECURSIVE 才能使首次查询结果逐层用于后续查询。
2. 后续查询 SELECT 必须指定缓存表还是原始表,如果直接指定 * 会出现行数不一致错误。