2011-06-04 51 views
0

我想創建一個MySql查詢,它將在2個循環內使用CONCAT函數構造一個字符串。MySQL查詢,如何以多種方式使用字符串?

我在想如果一個字符串既可以作爲一個變量,也可以作爲表中某個字段的引用?

到目前爲止我的代碼是下面,這是更新線附近將一些語法錯誤:

... 

WHILE x <= 5 DO 
     WHILE y <= 3 DO 
       SELECT @str_data = CONCAT(str,'data_',x); 
     SELECT @str_data = CONCAT(str,'_',y); 

     SELECT @variable:= @str_data FROM sometable WHERE id = '@counter + y'; 

     UPDATE anothertable SET @str_data = @variable WHERE id = '@counter + y'; 

      SET y = y + 1; 
    END WHILE; 
    SET x = x + 1; 
    SET @counter = counter + 3; 
END WHILE; 

我已經檢查了所有變量的設置。

在旁註中我可能沒有正確使用concat,因爲我看到它在多個示例中的使用方式不同。我打算採用 格式,最終結果爲:'data_x_y'。 (通過添加 '_y' 到當前字符串的結尾:?=)

回答

1

讓我們從頭開始: 更改此代碼:

SELECT @str_data = CONCAT(str,'data_',x); 
SELECT @str_data = CONCAT(str,'_',y); 

要:

SET @str_data = CONCAT(str, 'data_',x,'_',y); 

我想知道爲什麼混合DECLARE變量(str)與@vars *(@ str_data)*,它看起來很混亂。

所以這個代碼:SELECT @variable:= @str_data FROM sometable WHERE id = @counter + y;

沒有做什麼,你認爲它。它只選擇@str_data 0或更多次,同時設置@變量。
如果您希望MySQL添加@counter + y,您需要從中刪除'引號,因爲引用它只會評估爲0並且不匹配。

此代碼是不正確:

UPDATE anothertable SET @str_data = @variable WHERE id = '@counter + y'; 

將其更改爲:

UPDATE anothertable SET fieldx = @variable WHERE id = @counter + y; 

注意,SQL是不是PHP,你不能使用@vars作爲佔位符的動態列名。
它確實沒有意義。
我想你想拿出一個字符串持有一個動態列名稱,並在該列上進行更新。
忘記使用這種方法,它將永遠不會在SQL中工作,這也不是SQL應該工作的方式。

做什麼,而不是

你的表更改成這種格式

Table proper 
    x integer 
    y integer 
    value varchar 
    otherfields ..... 

現在你可以只是

UPDATE proper SET value = @var WHERE x = 1 and y = 2; 

更清潔,更新速度也快。

+0

感謝您的迴應,但這是問題所在。我需要字符串作爲表中字段的引用。字符串內容本身(例如:「data_1_2」)將成爲使用的字段的名稱。 – user723789 2011-06-04 11:30:34

+0

@user,你不能這麼做,那不是SQL的工作原理。 – Johan 2011-06-04 12:32:05

+0

感謝您的幫助,即時移動到php方法 – user723789 2011-06-04 12:44:56