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”关键字吗?
如何在不使用存储过程的情况下执行上述查询?
答案 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子集中。