2

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

给定一个 table t10company,我有一个名为CompanyIDwhich is of的列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,这是我所期望的。

如果我发出完全相同的查询,除了 withINTO @myvar然后执行 aSELECT @myvar它总是返回 NULL。它在我正在编写的存储过程中执行此操作,并且还在 MySQL Workbench 的查询窗口中执行此操作。我不知道为什么?

4

4 回答 4

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

于 2012-07-19T21:19:21.827 回答
1

对于简单的 max(),您的查询中不需要“分组依据”、“排序依据”或“限制”。消除这些,如果这不起作用,请尝试围绕它包装另一个查询。

select
   value into @myvar
from (
     SELECT
        MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) as value
     FROM
        t10company 
     WHERE
        LEFT(CompanyID, 4) = 'MYCO'
     )
于 2012-07-19T21:17:58.480 回答
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 来看,查询的额外成本应该可以忽略不计。

于 2012-07-19T21:46:02.983 回答
0

如果您打算这样做,您需要添加LEFT(CompanyID, 4)到您的SELECT声明(之前)FROMGROUP BY LEFT(CompanyID, 4)

于 2012-07-19T21:15:49.390 回答