2 votes

Exécution récursive d'une fonction MySQL

J'ai une fonction dans MySQL qui doit être exécutée environ 50 fois (pas une valeur fixe) dans une requête. les entrées sont c [1,2,3,4,5,6,7,8,9,10]

lors de l'exécution individuelle de la requête MySQL, tout se passe bien, voir ci-dessous

column_name indique la colonne pour laquelle il obtient les données, dans ce cas, il s'agit d'un DOUBLE dans la base de données.

La deuxième valeur du MOD() est l'entrée que je fournis à MySQL à partir du tableau susmentionné

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

Pour obtenir le résultat souhaité*, le code suivant fonctionne

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

Cependant, il est évident que cette méthode est extrêmement salissante et qu'elle devient très inefficace si l'on dispose non pas de 3 entrées, mais de plus de 50.

Outre le fait d'appeler plus de 50 questionnaires individuels, existe-t-il un meilleur moyen d'atteindre l'objectif fixé ? même type (voir ci-dessous) de la production ?

En fait, je dois fournir à MySQL une liste de valeurs et lui faire exécuter MOD() sur l'ensemble d'entre eux sur une colonne spécifiée.

Les seules données que j'ai besoin de renvoyer sont les id des lignes qui correspondent à la MOD() avec l'entrée spécifiée (voir la valeur 2 de la fonction MOD() ) lorsque le rendement est inférieur à 10

A noter, MOD() a été utilisée comme exemple de fonction, mais la fonction finale requise devrait être une fonction de remplacement.

exemple de présentation de tableau

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

(Le titre est peut-être mal formulé, je ne sais pas trop comment expliquer autrement ce que j'essaie de faire ici)

2voto

Gordon Linoff Points 213350

Utiliser un join et une table dérivée ou une table temporaire :

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;

Si vous souhaitez que les résultats soient présentés sous forme de colonnes, vous pouvez ensuite utiliser l'agrégation conditionnelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X