2

次の3つのテーブルがあります。

テーブル「名前」       
---------------
ID名
---------------
1冊
2ペン


テーブル「色」
------------------
IDカラー
------------------
赤1個
2 イエロー
3 緑
4 ピンク


表「両方」
------------------------
id名の色
----------------------
1 1 1
2 1 2
3 1 3
4 2 2

そして、私は次の機能を持っています:

    DELIMITER //

    CREATE FUNCTION get_word(n VARCHAR(20))
        RETURNS VARCHAR(10)
        READS SQL DATA
        DETERMINISTIC
        BEGIN
            DECLARE b VARCHAR(20);
       SELECT  `color`.`color` INTO b  FROM   `name` 
        LEFT JOIN `both` 
          ON `name`.`id`=`both`.`name`
        LEFT JOIN `color`
          ON `color`.`id`=`both`.`color` 
       WHERE `name`.`name`=n;        

        RETURN b;
        END//

    DELIMITER ;

SELECT get_word('pen')を実行する と、期待どおりの黄色が 返されます。

しかし、コード SELECT get_word('book')を実行する と、エラーが発生します: #1172 - 結果は複数の行で構成されていました

私の質問: この関数が「ペン」を検索するときに行う単一のレコードだけでなく、複数のレコードでも機能するようにするにはどうすればよいですか? ありがとう

アップデート:

次のように関数なしでクエリを使用すると、正常に機能します。

       SELECT  `color`.`color` AS b  FROM   `name` 
        LEFT JOIN `both` 
          ON `name`.`id`=`both`.`name`
        LEFT JOIN `color`
          ON `color`.`id`=`both`.`color` 
       WHERE `name`.`name`='book'; 

そしてそれは戻ります:

**b**
赤
黄色
緑
4

2 に答える 2

3

さて、結果セット(複数の値)が必要なようです

ただし、mysql ストアド関数は結果セットを返すことができません (ドキュメント: ストアド関数の制限を参照してください)。

解決策 1 : ストアド プロシージャを使用する

CREATE PROCEDURE get_word(n VARCHAR(20))
BEGIN
 SELECT  `color`.`color` 
 FROM   `name` 
   LEFT JOIN `both` 
          ON `name`.`id`=`both`.`name`
   LEFT JOIN `color`
          ON `color`.`id`=`both`.`color` 
   WHERE `name`.`name`=n; 
END

Solution2 : 連結された文字列を返す

GROUP_CONCATのようなもの"green, yellow, blue" は、それを簡単に行うことができます。たとえば、このstackoverflowの質問を参照してください

于 2013-08-28T14:18:57.510 に答える
0

group by after を使用してみてください。whereたとえばgroup by id、テーブルに一意のものを追加してみてください。

于 2013-08-28T13:56:07.123 に答える