2012-07-19 66 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判斷,查詢額外成本應該可以忽略不計。