2016-12-28 29 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 = 

にそれを適用しているので、1つのタイトルのみが返さがあることができます。それらのサブクエリのそれぞれから結果をチェックアウトし、そのうちの1つが複数の結果を返すかどうかを確認します。その場合は、追加のWHERE句を追加して結果を絞り込む必要があります。

+0

変数に複数行を保存するにはどうすればよいですか?私は好きな曲や嫌いな曲を返そうとしています。 dislike(1)は好きな曲を返す必要があります。私は明確です。ありがとうマイケル。 – Abhishek

+0

@Abhishekでは、複数の値を1つの変数に格納/返すことはできません(Gordonの答えが示唆するように、文字列を連結する以外)。 – Uueerdo

関連する問題