mysql如何使用给定的值集

时间:2015-07-06 02:45:16

标签: mysql sql arrays sql-update

我想用一组给定值的值更新表的每一行的列。例如:

id     name     code
---------------------
1      n1       
2      n2     
3      n3 

我有这一系列的价值['代码1','代码2','代码3']我想要设置为每一行,因此对于第一行,代码列的值将是' code-1'从数组中,第二行代码列的值将是' code-2'并且对于代码列的第三行值将是' code-3'从数组。所以决赛桌看起来像这样:

id     name     code
---------------------
1      n1       code-1
2      n2       code-2
3      n3       code-3

如何在一个SQL查询中执行此操作?

4 个答案:

答案 0 :(得分:2)

你可以这样做:

update table t
    set code = concat('code-', id)
    where id in (1, 2, 3);

如果代码与ID无关,则可以使用case

update table t
    set code = (case when id = 1 then 'code-1'
                     when id = 2 then 'code-2'
                     when id = 3 then 'code-3'
                end)
    where id in (1, 2, 3);

答案 1 :(得分:0)

创建一个新表(temp)以使用类似

的模式保存数组
{{1}}

并使用此更新语句更新原始表

{{1}}

答案 2 :(得分:0)

你如何识别"第一排"在桌子上?怎么样"第二行"?

要获得UPDATE语句,我首先使用SELECT语句启动,该语句返回行以及要分配的新值。

"数组"你现在有,如果将它转换为表格,那将是最简单的。如果您不想定义表并加载它,我们可以使用内联视图,但语句的大小可能是一个限制。

如果我们运行此查询,例如:

  SELECT 1 AS rownum, 'code-1' AS code
  UNION ALL SELECT 2, 'code-2'
  UNION ALL SELECT 3, 'code-3'

我们在结果集中返回三行,我们可以像表一样引用它们。使用额外的UNION ALL SELECT对其进行扩展,以添加其他行。

为了从我们想要更新的表中获取相应的rownum值,我们返回主键(或唯一的非null键),并按我们想要的顺序返回它们,因此第一行得到一个rownum 1,第二行得到rownum为2,等等。例如:

  SELECT r.id
       , @rn := @rn + 1 AS rowumn
    FROM mytable r
   CROSS JOIN ( SELECT @rn := 0 ) i
   ORDER BY r.name, r.id

使用这两个结果,我们可以加入到我们想要更新的表中,返回我们想要分配给该行的新代码值,例如:

  SELECT t.id
       , t.name
       , t.code AS old_code
       , c.code AS new_code
       , o.rownum
    FROM ( SELECT 1 AS rownum, 'code-1' AS code
           UNION ALL SELECT 2, 'code-2'
           UNION ALL SELECT 3, 'code-3'
         ) c
    JOIN ( SELECT r.id
                , @rn := @rn + 1 AS rowumn
            FROM mytable r
            CROSS JOIN ( SELECT @rn := 0 ) i
            ORDER BY r.name, r.id
         ) o
      ON o.rownum = c.rownum
    JOIN mytable t
      ON t.id = o.id 

一旦我们对我们想要更新的行以及我们想要分配给每一行的新值感到满意,我们可以通过替换{将其转换为UPDATE语句{1}} SELECT ... FROM,并在语句末尾添加UPDATE子句。 (如果我们有SET子句,则在WHERE子句之前。)

WHERE

我是怎么做的。

如果"新代码中的行数"数组很大,我创建一个表,并将数组值加载到表中。然后使用对表的引用替换内联视图查询 UPDATE ( SELECT 1 AS rownum, 'code-1' AS code UNION ALL SELECT 2, 'code-2' UNION ALL SELECT 3, 'code-3' ) c JOIN ( SELECT r.id , @rn := @rn + 1 AS rowumn FROM mytable r CROSS JOIN ( SELECT @rn := 0 ) i ORDER BY r.name, r.id ) o ON o.rownum = c.rownum JOIN mytable t ON t.id = o.id SET t.code = c.code

c

或者,我可以将声明分解为可管理的块。做20个代码,然后为下一组20行:

    FROM my_new_code_table c

答案 3 :(得分:0)

我想出了解决问题的另一种方法,因为我有成千上万的条目需要使用连接进行纠正:

UPDATE `entry`
JOIN 
( *DEFINE QUERY FOR LOOKUPTABLE HERE* ) as alias
on alias.id=entry.valuetoreplace
SET `valuetoreplace` = alias.newvalue;