2016-12-28 109 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

相關問題