2

我有以下 3 个表:

表“名称”       
---------------
身份证名称
---------------
1 本书
2 笔


表“颜色”
------------------
身份证颜色
------------------
1红色
2 黄
3 绿色
4 粉红色


表“两者”
----------------------
身份证名称颜色
----------------------
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

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

"green, yellow, blue" GROUP_CONCAT 这样的东西可以很容易地做到这一点。例如,请参阅此stackoverflow 问题

于 2013-08-28T14:18:57.510 回答
0

尝试使用 group by after where,例如尝试添加group by id表中唯一的内容。

于 2013-08-28T13:56:07.123 回答