2012-07-19 92 views
2

出于某种原因,我不能让这个查询时,我做了选择进入返回一个值。MySQL的SELECT INTO <variable>返回null,但查询返回的值

给定一个表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的查询窗口中执行此操作。我不知道为什么?

回答

0

你需要(以前FROM)添加LEFT(CompanyID, 4)SELECT声明如果您在您的查询要GROUP BY LEFT(CompanyID, 4)

+0

通常在SELECT列表中包含GROUP BY表达式,但不是必需的。 – spencer7593 2012-07-19 21:21:26

1

你不“按订单”需要“按组”,或“限制”为一个简单的max()。消除这些,如果这不起作用,请尝试围绕它包装另一个查询。

select 
    value into @myvar 
from (
    SELECT 
     MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) as value 
    FROM 
     t10company 
    WHERE 
     LEFT(CompanyID, 4) = 'MYCO' 
    ) 
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; 

BY子句中的顺序表达是有点奇怪。

为什么你会通过下订单?聚合只会返回一行。不清楚MySQL是否忽略了这一点,因为MySQL可能不会确定所有满足WHERE子句的行将被分组到一个单独的行中。

对于这个特殊的说法,LIMIT 1是多余的。

我建议你尝试没有ORDER BY,只是为了看看有什么差别。

否则,我倾向于同意也许聚合函数和GROUP BY可能是问题。如果是这样,他们可能的解决方法是将您的语句作为内联视图(将其作为别名)包装在一组括号中,然后从内联视图中进行选择。

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判断,查询额外成本应该可以忽略不计。