2013-06-06 4 views
0

Étant donné un nombre, comment puis-je faire défiler un ensemble de nombres en fonction de ce nombre, dans une fonction MySql?MySql utilisant une boucle while dans une fonction

Pour obtenir une image plus claire, SVP voir ma question où j'ai demandé comment quelque chose comme ceci pourrait être fait en php. Question here.

Je vais faire select myfunction(thenumber). Basé sur ce nombre, je dois boucler.

A partir de maintenant,

If thenumber = 1 then loop backward thru 1,4,7 only 
If thenumber = 2 then loop thru 3 
If thenumber = 3 then loop thru 10 

est ici la fonction que j'ai tripotent.

CREATE DEFINER=`root`@`localhost` FUNCTION `whileloop`(`danum` VARCHAR(2050)) 
    RETURNS varchar(1500) 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 
DECLARE x INT; 
DECLARE str VARCHAR(255); 
SET x = danum; 
SET str = ''; 
#If x = 1, while = 1, 4, 7//////// 
WHILE x >= 1 DO //I'm stuck here 
SET str = CONCAT(str,x,','); 
SET x = x - 1; 
END WHILE; 
RETURN str; 
END 

Comment puis-je faire dans une fonction MySQL, ce que j'ai fait php. En PHP, nous avons stocké des choses dans un tableau. Comment pouvons-nous faire cela ici?

Modifier

Résultat

Ce que je suis en train de sortir à la fin sont des liens.

So if `thenumber = 1` 
`<a href=foo.php?id=1> <a href=foo.php?id=4> <a href=foo.php?id=7>` //3 Links Output in a single row 
If `thenumber = 2` 
`<a href=foo.php?id=3>` //Same as above. Output in a single row. 
If `thenumber = 10` 
`<a href=foo.php?id=10>` 
+0

fonctions Mysql ne retournent une valeur scalaire. Par conséquent, vous ne pouvez pas faire exactement ce que vous avez fait en php. Expliquer plus clairement ce que vous attendez de votre fonction? Si vous passez 1 en argument, attendez-vous simplement qu'une chaîne '1, 4, 7' soit renvoyée? – peterm

+0

Non. Je veux que la boucle while fasse une boucle sur les numéros 1, 4, 7. Le résultat est un lien comme celui-ci (exemple pour 1): '' – Norman

+0

Vous voulez ces liens comme valeur varchar ou vous les attendez être des rangées? – peterm

Répondre

1

Vous cherchez cet?

CREATE FUNCTION mylink(n INT) 
RETURNS VARCHAR(512) DETERMINISTIC 
RETURN CONCAT('<a href=foo.php?id=',n,'>'); 

CREATE FUNCTION myfunction(n INT) 
RETURNS VARCHAR(512) DETERMINISTIC 
RETURN CASE n 
    WHEN 1 THEN CONCAT(mylink(1), mylink(2), mylink(7)) 
    WHEN 2 THEN mylink(3) 
    WHEN 3 THEN mylink(10) 
END; 

Pour l'utiliser

SELECT myfunction(n) links 
FROM 
(
    SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 
) a 

Sortie:

|               LINKS | 
------------------------------------------------------------------- 
| <a href=foo.php?id=1><a href=foo.php?id=2><a href=foo.php?id=7> | 
|           <a href=foo.php?id=3> | 
|           <a href=foo.php?id=10> | 

est ici SQLFiddle Démo

+0

Fermer, très proche. Je tripote pourquoi même 3 et 10 retournent 3 liens. – Norman

+0

@Norman Désolé, c'était une faute de frappe dans les deux fonctions. Mise à jour de la réponse et sqlfiddle. – peterm

+0

Fonctionne très bien. Je vais ajouter tous les autres cas là-dedans :) – Norman