递归运行MySQL函数

时间:2018-10-02 14:47:43

标签: mysql sql database

我在MySQL中有一个函数,需要在查询中运行约50次(而不是设置值)。输入当前存储在一个数组中,例如  [1,2,3,4,5,6,7,8,9,10]

单独执行MySQL查询时,它可以正常工作,请参见下文

column_name表示要为其获取数据的列,在这种情况下,它是数据库中的DOUBLE

MOD()函数中的第二个值是我从上述数组中提供MySQL的输入

SELECT id, MOD(column_name, 4) AS mod_output
FROM table
HAVING mod_output > 10

要获得输出,我需要*以下代码有效

SELECT id, MOD(column_name, 4) AS mod_output1, MOD(column_name, 5) AS mod_output2, MOD(column_name, 6) AS mod_output3
FROM table
HAVING mod_output1 > 10 AND mod_output2 > 10 AND mod_output3 > 10

但是,这显然是非常肮脏的,并且当没有3个输入但超过50个输入时,这将变得非常低效。

Appart通过调用50个以上的查询,是否有更好的方法来实现相同排序(见下文)的输出?

在紧急情况下,我需要为MySQL提供一个值列表,并使其在指定列上的所有值上运行MOD()

我需要返回的唯一数据是与id函数输出与指定输入匹配的行中的MOD(),(请参见MOD()函数的值2),其中输出少于10

请注意,MOD()已用作示例函数,但是,所需的最后一个功能*应该*是替代品

表格布局示例

id | column_name
1  | 0.234977
2  | 0.957739
3  | 2.499387
4  | 48.395777
5  | 9.943782
6  | -39.234894
7  | 23.49859
.....

(标题可能写错了,我不太确定你还会怎么解释我在这里要做的事情)

1 个答案:

答案 0 :(得分:2)

使用join和派生表或临时表:

SELECT n.n, t.id, MOD(t.column_name, n.n) AS mod_output
FROM table t CROSS JOIN
     (SELECT 4 as n UNION ALL SELECT 5 UNION ALL SELECT 6 . . .
     ) n
WHERE MOD(t.column_name, n.n) > 10;

如果要将结果作为列,则可以在以后使用条件聚合。