Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从具有可选值的数据库表中检索所有组合_Php_Mysql_Sql_Math - Fatal编程技术网

Php 从具有可选值的数据库表中检索所有组合

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

假设我们在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);
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)