出于某种原因,当我选择进入时,我无法让这个查询返回一个值。
根据表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 :(得分: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;或"限制"在您查询简单的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判断,查询额外费用应该可以忽略不计。