我的功能如下:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `get_year_groups_for_visit`(id int) RETURNS varchar(200) CHARSET latin1
BEGIN
declare year_text varchar(200);
select group_concat(year_text, ' ') into year_text from a_visit_year_group yg
join year_group y on yg.year_group_id = y.year_group_id
where yg.visitid = id;
RETURN year_text;
END
如果我使用
来调用它select get_year_groups_for_visit(1918)
我得到的答案为null但如果我输入
select group_concat(year_text, ' ') as 'Year Groups' from a_visit_year_group yg
join year_group y on yg.year_group_id = y.year_group_id
where yg.visitid = 1918;
我得到答案'13年级,12年级'
如果我查看表a_visit_year_group,其中visitid是1918年我得到了
> visitid year_group_id
1918 14
1918 15
并且在表year_group中我得到了
> year_group_id year_text
14 Year 12
15 Year 13
实际上,a_visit_year_group中的条目不可能具有year_group_id或visitid的空值,并且表year_group_id中的条目不可能具有year_group_id或year_text的空值,所以我不能理解为什么我只使用此函数返回空值。我已经测试了它只有一个值可以回来,哪里有几个值,它总是返回null。我知道如果你连接值并且一个值为null,答案总是为null,但这里确实没有空答案。
我现在开始把头发拉出来,因为我看不出哪里出错了,一定是我想念的非常简单的东西。我真的很感激一些见解。我需要获得每次访问所涉及的访问列表和年度组,有时每次访问都有几个年度组,有时只有1个,我不想每次访问多行,所以我想我可以创建一个函数将所有值作为一个
返回答案 0 :(得分:1)
您的变量与列year_text
的名称相同;在你的查询中,它不会引用列,而是引用变量两次,所以你在这里连接变量。
局部变量的名称不应与表列相同。如果SQL语句(例如SELECT ... INTO语句)包含对列的引用和声明的具有相同名称的局部变量,则MySQL当前将该引用解释为变量的名称。
要么(首选)为变量使用不同的名称,要么将表(-alias)添加到列中以获得正确的范围:
select group_concat(y.year_text, ' ') into year_text
from ... join year_group y ...