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

时间:2013-04-16 14:47:47

标签: 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

因此,当用户搜索“M1”时,系统将显示:

M1
M2
M3
M4

当用户搜索“M3”时,系统将显示:

M3
M4

当用户搜索“N”时,系统将显示:

N
N1
N2
N3

显然,这种查询需要某种循环,即在“是”之后搜索任何单词,然后在该单词之后不断搜索单词。

我想在MySQL中使用普通的“选择SQL”而不是使用存储过程来执行此任务。但我不知道该怎么做。

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

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

2 个答案:

答案 0 :(得分:2)

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

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等结果。如果你需要"循环"更多信息,您可以在查询中添加另一个LEFT JOIN

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

You will however be limited in the number of tables you can join this way

  

单个连接中可引用的最大表数   是61。

您需要使用服务器端语言(PHP?)来检查Value2,Value3 ... ValueN是否为空。

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

答案 1 :(得分:0)

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

但是,我向你提出,你有一个更大的问题,你正在实现被称为“天真树”的经典SQL反模式;我强烈建议您查看幻灯片SQL Anti-Patterns Strike Back - 特别是从幻灯片48开始的部分,作者将提供可行的替代方案,使您的问题更容易封装在数据库支持的SQL子集中。