SQL 结果不止一行
SQL Result consisted of more than one row
我想 return 10 json 个带有 mysql 的字符串和来自我的数据库的数据,但我得到了休闲错误:SQL 错误 (1172):结果由不止一排组成!
是的,我知道结果包含更多行,它们是 10,问题是如何将它们全部打印在不同的行中?
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 变量的数量不正确!为什么?
更新
编辑下一行:
SELECT id --,email,name,lastname -- INTO ids,semail,sname,slastname
获得 NULL
回复
不得使用函数。
也许从此查询定义视图?像这样:
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 ...
或者直接在查询中使用"if",没有作用。
是的,最后我不会使用循环和游标来注册此查询的响应,我会使用这样的 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!
我想 return 10 json 个带有 mysql 的字符串和来自我的数据库的数据,但我得到了休闲错误:SQL 错误 (1172):结果由不止一排组成! 是的,我知道结果包含更多行,它们是 10,问题是如何将它们全部打印在不同的行中?
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 变量的数量不正确!为什么?
更新
编辑下一行:
SELECT id --,email,name,lastname -- INTO ids,semail,sname,slastname
获得 NULL
回复
不得使用函数。 也许从此查询定义视图?像这样:
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 ...
或者直接在查询中使用"if",没有作用。
是的,最后我不会使用循环和游标来注册此查询的响应,我会使用这样的 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!