繁体   English   中英

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

[英]MySQL CREATE FUNCTION result with multiple records gives error #1172

我有以下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

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

但是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

解决方案2 :返回一个串联的字符串

诸如"green, yellow, blue" GROUP_CONCAT之类的内容可以轻松实现。 例如,请参阅此stackoverflow问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM