我有以下三张桌子:
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