我正在尝试编写一个程序,用于更新给定列名中的值,其中用户ID等于给定的用户ID。
_strong_1是一个包含列名的变量,例如:' category_1',例如。
SELECT COLUMN_NAME FROM information_schema.`COLUMNS` C
WHERE table_name = 'subscribers_preferences' AND COLUMN_NAME LIKE _strong_1 INTO @columns;
SET @table = 'subscribers_preferences';
SET @s = CONCAT('UPDATE ',@table,' SET ', @columns = 1);
PREPARE stmt FROM @s;
EXECUTE stmt;
' SET @s ='内有错误。声明。我可以使用一个简单的SELECT语句来处理它,但UPDATE很棘手。
提前致谢。
答案 0 :(得分:1)
您需要将= 1
放在引号中。
SET @s = CONCAT('UPDATE ',@table,' SET ', @columns, ' = 1');
否则,您将@columns
与1
进行比较,并将1
或0
连接起来(可能总是0
,因为我怀疑你有1
SQL的名为@columns
的列,它创建了无效的SQL。
请注意,上面的代码只会更新一列。如果GROUP_CONCAT
应该包含3列,则需要在设置它的查询中使用SELECT GROUP_CONCAT(CONCAT(column_name, ' = 1')) AS @columns
FROM information_schema.columns
WHERE table_name = 'subscribers_preferences' and column_name LIKE _strong_1;
SET @table = 'subscribers_preferences';
SET @s = CONCAT('UPDATE ',@table,' SET ', @columns);
。
WHERE
我怀疑您还需要为此SQL添加(user_id, setting_name)
子句,以便它只更新给定ID的行。如目前所写,它将更新所有行。
您需要编写这样的查询这一事实表明数据的规范化程度不正确。它们不是将每个首选项选项放在不同的列中,而应该是表的不同行,其中的键类似于{{1}}。