我有以下三张桌子:

table "name"
---------------
id     name
---------------
1      book
2      pen


table "color"
------------------
id     color
------------------
1       red
2       yello
3       green
4       pink


table "both"
------------------------
id     name      color
----------------------
1      1            1
2      1            2
3      1            3
4      2            2

and I have the following function:

    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 ;

现在当我跑的时候
选择get_word('pen')
它返回黄色,这是预期的。
但是当我运行代码时
选择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';

它返回:
**乙**
红色
黄色的
绿色

最佳答案

嗯,似乎您需要一个resultset(多个值)
但是mysql存储函数不能返回resultset(请参见存储函数的限制)。
解决方案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

解决方案2:返回连接字符串
类似于"green, yellow, blue"
康卡特小组很容易做到这一点。
例如,请参见doc

10-05 22:10