2

何らかの理由で、select into を実行したときに、このクエリで値を返すことができません。

table が与えられた場合、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 を取得します。

with を除いてまったく同じクエリを発行してINTO @myvarから a を実行するSELECT @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;

ORDERBY句の式は少し奇妙です。

なぜそれで注文するのですか?アグリゲートは1行のみを返します。ただし、MySQLがWHERE句を満たすすべての行が単一にグループ化されることを識別していない可能性があるため、MySQLがそれを無視しているかどうかは明らかではありません。

この特定のステートメントでは、LIMIT1は冗長です。

ORDER BYなしで試してみて、違いが生じるかどうかを確認することをお勧めします。

そうでなければ、おそらく集計関数とGROUPBYが問題になる可能性があることに同意する傾向があります。そうである場合、考えられる回避策は、ステートメントを一連の括弧でインラインビューとしてラップし(エイリアスを指定)、インラインビューから選択することです。

于 2012-07-19T21:19:21.827 に答える
1

単純な max() のクエリでは、「group by」、「order by」、または「limit」は必要ありません。それらを排除し、それが機能しない場合は、別のクエリをラップしてみてください。

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ステートメントに(の前にFROM)追加する必要がありますGROUP BY LEFT(CompanyID, 4)

于 2012-07-19T21:15:49.390 に答える