MySQL SELECT INTO <variable> 返回 null 但查询返回一个值

标签 mysql select

出于某种原因,当我进行选择时,我无法让此查询返回值。

给定一个表t10company,我有一个名为CompanyID的列,它的类型是CHAR(8),它的值是:MYCO0001

如果我发出以下查询:

SELECT
    MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER))
    FROM t10company 
    WHERE LEFT(CompanyID, 4) = 'MYCO'
    GROUP BY LEFT(CompanyID, 4) 
    ORDER BY RIGHT(CompanyID, 4) LIMIT 1;

我得到的返回值为 1,这正是我所期望的。

如果我发出完全相同的查询,但使用 INTO @myvar 除外,然后执行 SELECT @myvar ,它总是返回 NULL。它在我正在编写的存储过程中执行此操作,也在 MySQL Workbench 的查询窗口中执行此操作。不知道为什么?

最佳答案

我使用这种形式为 MySQL 中的用户变量赋值

SELECT @myvar := MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) FROM ...

根据 5.1 文档,这也应该有效:

SELECT MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) INTO @myvar FROM ...

我运行了一个快速测试(MySQL 5.1),最终的 SELECT 显示 @myvar 被设置为 1。

CREATE TABLE t10company (CompanyID CHAR(8));
INSERT INTO t10company VALUES ('MYCO0001');
SET @myvar := NULL;
SELECT @myvar;
SELECT
MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) INTO @myvar
FROM t10company 
WHERE LEFT(CompanyID, 4) = 'MYCO'
GROUP BY LEFT(CompanyID, 4) 
ORDER BY RIGHT(CompanyID, 4) LIMIT 1;
SELECT @myvar;

ORDER BY 子句中的表达式有点奇怪。

你为什么要这样订购?聚合只会返回一行。但不清楚 MySQL 是否忽略了这一点,因为 MySQL 可能无法识别满足 WHERE 子句的所有行将被组合在一起。

对于这个特定的语句,LIMIT 1 是多余的。

我建议您尝试不使用 ORDER BY,只是为了看看这是否有任何区别。

否则,我倾向于认为聚合函数和 GROUP BY 可能是问题所在。如果是,可能的解决方法是将语句作为内联 View 包装在一组括号中(为其指定别名),然后从内联 View 中进行选择。

关于MySQL SELECT INTO <variable> 返回 null 但查询返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569351/

相关文章:

mysql - 优化具有多个 CONCAT 子句的 SQL 语句?

mysql - 在 SQL 中第二次选择最大值

html - 一旦你在多选 html 列表框中选择了一个项目,无论如何都取消选择

选择随机记录并在一个查询中更新相同的记录?

mysql - 通过分组选择最大日期?

mysql - 从表中选择消息

mysql - 当数据可以出现在一张表的多列中时,连接两个表的结果

MySql存储过程创建错误

MySQL如何得到想要的结果

MySQL 查询 2 个表在旁边加入列