2015-01-09 2 views
0

Я хочу вернуть 10 строк json с mysql с данными из моей базы данных, но я получаю ошибку: SQL Error (1172): Результат состоял из нескольких строк! Да, я знаю, что результат состоит из большего количества строк, их 10, проблема заключается в том, как печатать их все в разных строках?SQL Результат состоял из нескольких строк

CREATE DEFINER=`root`@`localhost` FUNCTION `search_for`(`value` TEXT) 
    RETURNS text CHARSET latin1 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 
    DECLARE sid TEXT; 
    DECLARE semail TEXT; 
    DECLARE sname TEXT; 
    DECLARE slastname TEXT; 
    DECLARE response TEXT; 

    SELECT id,email,name,lastname INTO sid,semail,sname,slastname 
    FROM user WHERE email LIKE CONCAT('%',value,'%') 
    OR lastname LIKE CONCAT('%',value,'%') 
    OR name LIKE CONCAT('%',value,'%') LIMIT 10; 

    IF (semail IS NOT NULL) THEN    
     SET response = CONCAT('{"response":1,"id":',sid,',"email":"',semail,'","name":"',sname,'","lastname":"',slastname,'"}'); 
    ELSE 
     SET response = CONCAT('{"response":0}'); 
    END IF; 

    RETURN response; 
END 

после я использовать курсор и цикл метод для получения результатов поиска в нескольких строках выглядеть следующим образом:

BEGIN 
    DECLARE finished INTEGER DEFAULT 0; 
    DECLARE ids TEXT; 
    DECLARE response TEXT; 
    DECLARE ids_cursor CURSOR FOR 
     SELECT id,email,name,lastname -- INTO ids,semail,sname,slastname 
     FROM user WHERE email LIKE CONCAT('%',value,'%') 
     OR lastname LIKE CONCAT('%',value,'%') 
     OR name LIKE CONCAT('%',value,'%'); 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 2; 

    OPEN ids_cursor; 
    get_ids: LOOP 

     FETCH ids_cursor INTO ids; 

     IF finished = 2 THEN 
      LEAVE get_ids; 
     END IF; 

     SET response = CONCAT(ids,";",response); 

    END LOOP get_ids; 
    CLOSE ids_cursor; 

    RETURN response; 
END 

и я все еще получаю маленькую ошибку (1328): Неверное количество FETCH переменных! Зачем?

Update

отредактирован следующая строка:

SELECT id --,email,name,lastname -- INTO ids,semail,sname,slastname

NULL получить ответ

+1

Вам нужно использовать курсор и петлю. –

+0

Я уже пробовал один раз, но никакого успеха не получилось. теперь, когда я точно знаю, что это ответ, я постараюсь исправить проблему. –

+0

сделано, я редактирую вопрос –

ответ

0

Да, в конце концов, я не буду использовать цикл и курсор рег ответ от этого запроса, я буду использовать JSON строку, как это:

BEGIN 
    DECLARE response TEXT; 

    SELECT CONCAT('{',GROUP_CONCAT(id SEPARATOR ','),'}') INTO response 
    FROM user 
    WHERE email LIKE CONCAT('%',value,'%') 
     OR lastname LIKE CONCAT('%',value,'%') 
     OR name LIKE CONCAT('%',value,'%'); 

    IF(response IS NOT NULL) THEN 
     RETURN response; 
    ELSE 
     RETURN CONCAT('{"response":0}'); 
    END IF; 

END 

я думаю, SQL курсор и петли являются для более продвинутых результатов , в любом случае работа просто прекрасна, я сделал здесь, tcx!

+0

Мне нравится функция GROUP_CONCAT, она делает свою работу здесь в этой ситуации –

0

не должны использовать функцию. Возможно определить вид из этого запроса? Как это:

create or replace view userquery select if(semail is not null, CONCAT('{"response":1,"id":',sid,',"email":"',semail,'","name":"',sname,'","lastname":"',slastname,'"}'),"0") response, email,lastname,name FROM user ;

И запрос

select response from userquery where ... 

Или просто использовать "если" в запросе, без функции.

+0

Я хочу использовать функцию и уже создаю view userquery в своей функции, но я не могу вернуть ответ от функции, поэтому i немного измените его с помощью 'if else's' aaand, и теперь я просто вернусь к укусу id-s, я думаю, что я отправлю ответ здесь –

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