2011-06-04 53 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