Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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/5/sql/80.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
在MYSQL中,我们可以使用普通的SELECTSQL而不是使用存储过程来执行循环吗?_Mysql_Sql_Loops - Fatal编程技术网

在MYSQL中,我们可以使用普通的SELECTSQL而不是使用存储过程来执行循环吗?

在MYSQL中,我们可以使用普通的SELECTSQL而不是使用存储过程来执行循环吗?,mysql,sql,loops,Mysql,Sql,Loops,好吧,她是我的问题。我得到了一个有3列的表:C1,C2,C3 C1 - C2 - C3 M - is - M1 N2 - is - N3 M2 - is - M3 M3 - is - M4 N1 - is - N2 M1 - is - M2 N - is - N1 C1-C2-C3 M-is-M1 N2-is-N3 M2-is-M3 M3-is-M4 N1-is-N2 M1-is-M2 N-is-N1 因此,当用户搜索“M1”时,系统将显示: M1 M2 M3 M4 M3 M4 N N1 N

好吧,她是我的问题。我得到了一个有3列的表:C1,C2,C3

C1 - C2 - C3 M - is - M1 N2 - is - N3 M2 - is - M3 M3 - is - M4 N1 - is - N2 M1 - is - M2 N - is - N1 C1-C2-C3 M-is-M1 N2-is-N3 M2-is-M3 M3-is-M4 N1-is-N2 M1-is-M2 N-is-N1 因此,当用户搜索“M1”时,系统将显示:

M1 M2 M3 M4 M3 M4 N N1 N2 N3 M1 平方米 M3 M4 当用户搜索“M3”时,系统将显示:

M1 M2 M3 M4 M3 M4 N N1 N2 N3 M3 M4 当用户搜索“N”时,系统将显示:

M1 M2 M3 M4 M3 M4 N N1 N2 N3 N N1 氮气 N3 显然,这种查询需要某种循环,即搜索“是”之后的任何单词,然后继续搜索该单词之后的单词

我想在MySQL中使用普通的“SELECTSQL”,而不是使用存储过程来完成这项任务。但我不知道该怎么做

我们必须使用“WITH”关键字吗

如何在不使用存储过程的情况下执行上述查询?

您可以使用递归CTE完成此任务;不幸的是,mysql还不支持这些


但是,我要告诉您,您有一个更大的问题,因为您正在实现被称为“朴素树”的经典SQL反模式;我强烈建议您查看幻灯片,尤其是从幻灯片48开始的部分,作者将提供可行的替代方案,使您的问题更容易封装到数据库支持的SQL子集中。

因此,坚持不使用存储过程的要求,可以使用以下查询:

SELECT t1.C1 AS Value1, t2.C1 AS Value2, t3.C1 AS Value3, t4.C1 AS Value4
FROM your_table t1
LEFT JOIN your_table t2 ON t1.C3=t2.C1
LEFT JOIN your_table t3 ON t2.C3=t3.C1
LEFT JOIN your_table t4 ON t3.C3=t4.C1
它将返回结果,例如
M1 M2 M3 M4
。如果需要更多“循环”,您可以向查询中添加另一个
左连接

SELECT t1.C1 AS Value1, t2.C1 AS Value2, t3.C1 AS Value3, t4.C1 AS Value4, t5.C1 AS Value5
FROM your_table t1
LEFT JOIN your_table t2 ON t1.C3=t2.C1
LEFT JOIN your_table t3 ON t2.C3=t3.C1
LEFT JOIN your_table t4 ON t3.C3=t4.C1
LEFT JOIN your_table t5 ON t4.C3=t5.C1
:

单个联接中可引用的最大表数 她61岁

您需要使用服务器端语言(PHP?)来检查Value2、Value3…ValueN是否为null


我的建议是使用存储过程,或者更改表架构,以避免以这种方式在表中循环。

要搜索的术语是“传递闭包”。例如,见Thax you Jocelyn。