错误代码:1242.子查询返回多于1行 - 函数
问题描述:
任何人都可以使用此代码来帮助我吗?错误代码:1242.子查询返回多于1行 - 函数
DROP FUNCTION IF EXISTS dislike;
DELIMITER //
CREATE FUNCTION dislike(disliked_id int(11)) RETURNS CHAR
BEGIN
DECLARE disliked_songs CHAR;
IF disliked_id = 1 THEN
SET disliked_songs = (SELECT song_title from songs
where like_flag IN (SELECT like_flag from songs where like_flag= 1));
ELSE
SET disliked_songs = (SELECT song_title from songs
where like_flag IN (SELECT like_flag from songs where like_flag= 0));
END IF;
RETURN disliked_songs;
END;
//
DELIMITER ;
select dislike(1);
我试图调用功能,但这样做会返回一个错误
答
子查询返回不止一行。你需要返回一个值。有多种方式:
- 使用
min()
或max()
。 - 使用
limit
。 - 使用
group_concat()
。
事情是这样的:
SELECT disliked_songs := group_concat(song_title)
FROM songs
WHERE like_flag = 1;
我不知道该做什么有用的功能。如果表songs
的行数超过了几行,那么还会冒着溢出字符串的风险。
我怀疑你想在子查询中的某个地方使用disliked_id
。
答
当您将变量'disliked_songs'设置为某个值时,不能有多个可能的值。换句话说,您的子查询
(SELECT song_title from songs where like_flag IN (SELECT like_flag from songs where like_flag= 1))
正在带回多个歌曲标题。由于您正在播放歌曲标题并将其应用于单个值
SET disliked_songs =
只能有一个标题返回。查看每个子查询的结果,看看其中一个是否返回多个结果。如果是这样,您必须通过添加额外的WHERE子句来缩小结果范围。
不要害羞。什么是错误? –
你认为这些查询究竟做了什么? – Uueerdo
很明显,函数的返回值是单个“char”。返回变量'disliked_songs'不会是char。 –