2016-12-28 139 views
0

任何人都可以使用此代码来帮助我吗?错误代码: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); 

我试图调用功能,但这样做会返回一个错误

+0

不要害羞。什么是错误? –

+0

你认为这些查询究竟做了什么? – Uueerdo

+0

很明显,函数的返回值是单个“char”。返回变量'disliked_songs'不会是char。 –

回答

0

子查询返回不止一行。你需要返回一个值。有多种方式:

  • 使用min()max()
  • 使用limit
  • 使用group_concat()

事情是这样的:

SELECT disliked_songs := group_concat(song_title) 
FROM songs 
WHERE like_flag = 1; 

我不知道该做什么有用的功能。如果表songs的行数超过了几行,那么还会冒着溢出字符串的风险。

我怀疑你想在子查询中的某个地方使用disliked_id

0

当您将变量'disliked_songs'设置为某个值时,不能有多个可能的值。换句话说,您的子查询

(SELECT song_title from songs where like_flag IN (SELECT like_flag from songs where like_flag= 1)) 

正在带回多个歌曲标题。由于您正在播放歌曲标题并将其应用于单个值

SET disliked_songs = 

只能有一个标题返回。查看每个子查询的结果,看看其中一个是否返回多个结果。如果是这样,您必须通过添加额外的WHERE子句来缩小结果范围。

+0

我应该如何在变量中保存多行?我正在尝试返回喜欢或不喜欢的歌曲。不喜欢(1)应该返回喜欢的歌曲,反之亦然。希望我清楚。谢谢迈克尔。 – Abhishek

+0

@Abhishek你不能在一个变量中存储/返回多个值(除了像Gordon的回答所暗示的那样连接字符串之外)。 – Uueerdo

相关问题