2013-06-06 2 views
0

Учитывая число, как я могу прокручивать набор чисел на основе этого числа внутри функции MySql?MySql с использованием цикла while внутри функции

Чтобы получить более четкое изображение, см. Мой вопрос, где я спросил, как что-то подобное можно сделать в php. Question here.

Я буду делать select myfunction(thenumber). Основываясь на этом количестве, я получил петлю.

В настоящее время,

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 

Вот функция я возился с.

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 

Как я могу сделать внутри функции MySql, что я сделал php. В php мы храним вещи в массиве. Как мы можем это сделать здесь?

Редактировать

Результат

То, что я пытаюсь получить в конце ссылки.

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

функции Mysql возвращают только скалярное значение. Поэтому вы не можете сделать то, что вы сделали в php. Объясните более четко, что вы ожидаете получить от своей функции? Если вы передадите 1 в качестве аргумента, вы просто ожидаете возвращения строки «1, 4, 7»? – peterm

+0

Нет. Я хочу, чтобы цикл while перемещался по номерам 1, 4, 7. Результат такой ссылки (пример для 1): '' – Norman

+0

Вы хотите, чтобы эти ссылки были как одно значение varchar, или вы ожидаете, что они будут быть рядами? – peterm

ответ

1

Вы ищете это?

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; 

Чтобы использовать его

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

Выход:

|               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> | 

Вот SQLFiddle демо

+0

Закрыть, очень близко. Я возился, почему даже 3 и 10 возвращают 3 ссылки. – Norman

+0

@Norman Извините, это была опечатка в обеих функциях. Обновлен ответ и sqlfiddle. – peterm

+0

Работает очень хорошо. Я добавлю все остальные случаи там :) – Norman

Смежные вопросы