我有以下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
答案 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
或表格中唯一的内容。