2

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

C1 - C2 - C3
 M - 是 - M1
N2 - 是 - N3
M2 - 是 - M3
M3 - 是 - M4
N1 - 是 - N2
M1 - 是 - M2
 N - 是 - N1

所以当用户搜索“M1”时,系统会显示:

M1
M2
M3
M4

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

M3
M4

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

ñ
N1
N2
N3

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

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

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

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

4

2 回答 2

2

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

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

但是,您可以通过这种方式加入的表格数量将受到限制

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

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

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

于 2013-04-16T17:13:47.207 回答
0

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

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

于 2013-04-16T15:05:57.727 回答