具有多个记录的MySQL CREATE FUNCTION结果给出错误#1172

时间:2013-08-28 13:50:07

标签: mysql function user-defined-functions

我有以下3个表格:

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

我有以下功能:

    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**
red
yellow
green

2 个答案:

答案 0 :(得分:3)

好吧,您似乎想要一个结果集(多个值)

但是mysql存储函数不能返回结果集(参见doc:存储函数的限制)。

解决方案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 :返回连接字符串

"green, yellow, blue"之类的东西 GROUP_CONCAT可以轻松完成。 例如,请参阅此stackoverflow question

答案 1 :(得分:0)

尝试在where之后使用分组,例如尝试添加group by id或表格中唯一的内容。