Php 从具有可选值的数据库表中检索所有组合
假设我们在MySql中创建了一个简单的DB table选项卡Php 从具有可选值的数据库表中检索所有组合,php,mysql,sql,math,Php,Mysql,Sql,Math,假设我们在MySql中创建了一个简单的DB table选项卡 CREATE TABLE `tab` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, `altval` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ); 并填充了一组示例数据: INSERT INTO tab VALUES(1,1,NULL); INSERT INTO tab VALUES(2,2,3
CREATE TABLE `tab` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val` int(11) DEFAULT NULL,
`altval` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
并填充了一组示例数据:
INSERT INTO tab VALUES(1,1,NULL);
INSERT INTO tab VALUES(2,2,3);
INSERT INTO tab VALUES(3,4,NULL);
INSERT INTO tab VALUES(4,5,6);
每行有一个值val,对于id=2,4,有一个可选值altval。SQL中是否有方法检索任意数据集的所有组合?(组合的数量是具有替代数据集的行数的2次幂,此处为:4,因此“abitrary”当然是有限的。)对于给定示例,结果应为:
(1,2,4,5)、(1,2,4,6)、(1,3,4,5)、(1,3,4,6)
在像php这样的脚本语言中,我会通过使用eval()生成嵌套for循环来解决这个问题。使用递归CTE:
WITH RECURSIVE cte AS (
-- continuous rn
SELECT CAST(val AS CHAR(11)) val, CAST(altval AS CHAR(11)) AS altval,
ROW_NUMBER() OVER(ORDER BY id) AS rn
FROM tab
), rec AS (
-- anchor
SELECT val AS result, rn
FROM cte
WHERE rn = 1
UNION ALL
SELECT altval AS result, rn
FROM cte
WHERE rn = 1
AND altval IS NOT NULL
UNION ALL
-- recursive part
SELECT CONCAT(rec.result, ',', cte.val), cte.rn
FROM rec
JOIN cte ON cte.rn = rec.rn+1
UNION ALL
SELECT CONCAT(rec.result, ',', cte.altval), cte.rn
FROM rec
JOIN cte ON cte.rn = rec.rn+1
WHERE cte.altval IS NOT NULL
)
SELECT result
FROM rec
WHERE rn = (SELECT COUNT(*) FROM cte); -- choosing only longest string
重新思考这个问题,它也可以通过递归编程来解决。也许用php比用SQL容易得多。太好了!它是有效的,但我看不出如何在结果中添加冒号。否则,对于大于9的值,结果不能被唯一拆分。@Stefan`我看不出如何在结果中添加冒号。`=>
CONCAT(rec.result,,',,cte.val)