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

时间:2012-07-19 21:09:17

标签: 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的查询窗口中执行此操作。我不知道为什么?

4 个答案:

答案 0 :(得分:2)

我使用此表单为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可能是问题所在。如果是,他们可能的解决方法是将您的语句包装在一组括号中作为内联视图(给它一个别名),然后从内联视图中选择。

答案 1 :(得分:1)

你不需要&#34;,&#34;按顺序#34;或&#34;限制&#34;在您查询简单的max()。消除这些,如果这不起作用,尝试围绕它包装另一个查询。

select
   value into @myvar
from (
     SELECT
        MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) as value
     FROM
        t10company 
     WHERE
        LEFT(CompanyID, 4) = 'MYCO'
     )

答案 2 :(得分:0)

如果您要前往LEFT(CompanyID, 4)

,则需要在SELECT声明(FROM之前)添加GROUP BY LEFT(CompanyID, 4)

答案 3 :(得分:0)

这很奇怪。

如果将查询包含在另一个查询中,它似乎可以正常工作。

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

根据EXPLAIN判断,查询额外费用应该可以忽略不计。