Mysql通过条件更新来自另一行列的行列

时间:2013-01-04 09:52:58

标签: mysql sql-update conditional row

我的表格中有类似的数据:

Col1 ; Col2;
G11  ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;

我想用简单的G11 col2更新G11-行col2,但不修改G12行,其中没有简单的G12行。

3 个答案:

答案 0 :(得分:3)

UPDATE 
    tableX AS upd
  JOIN
    tableX AS simple
      ON  simple.Col1 NOT LIKE '%-%'
      AND upd.Col1 LIKE CONCAT(simple.Col1, '-%')
SET
    upd.Col2 = simple.Col2 ;

SQL-Fiddle

中进行测试

此查询将显示预期的编辑内容,而不会更新任何内容:

SELECT upd.Col1, upd.Col2, 
       simple.Col1 AS simpleCol1, simple.Col2 AS New_value
FROM 
    tableX AS upd
  JOIN
    tableX AS simple
      ON  simple.Col1 NOT LIKE '%-%'
      AND upd.Col1 LIKE CONCAT(simple.Col1, '-%') ;

答案 1 :(得分:2)

感谢@Ypercube创建了sqlfidle。以下是使用instr进行验证的另一种方法。似乎快一点。

仅限选择查询。更新查询也可以具有instr语法。

SELECT *
FROM tableX ;

SELECT upd.Col1, upd.Col2, 
       simple.Col1 AS simpleCol1, simple.Col2 AS New_value
FROM 
    tableX AS upd
  JOIN
    tableX AS simple
      ON  instr(simple.Col1 ,'-') = 0
      AND upd.Col1 LIKE CONCAT(simple.Col1, '-%') ;

结果:

COL1    COL2    SIMPLECOL1  NEW_VALUE
G11-1   0   G11         112
G11-2   2   G11         112

答案 2 :(得分:0)

Ypercube的解决方案是正确和干净的,bonCodigo的想法很棒!但是它们都可以简化一点。如果此条件返回true:

upd.Col1 LIKE CONCAT(simple.Col1, '-%')

这意味着upd.Col1确实包含({至少)-simple.Col1多个-,并且只允许一个simple.Col1,例如您的示例数据,-已经没有ON simple.Col1 NOT LIKE '%-%' ON instr(simple.Col1 ,'-') = 0 ,所以这两个条件都是多余的:

INSTR

但是我喜欢使用LIKE的想法,它不能总是替换SELECT upd.Col1, upd.Col2, simple.Col1 AS simpleCol1, simple.Col2 AS New_value FROM tableX AS upd JOIN tableX AS simple ON instr(upd.Col1, concat(simple.Col1, '-')) ,但是当它可以时,它可以更快。我会写这样的SELECT查询:

{{1}}

和UPDATE查询非常相似。由于这只是对其他答案的整合,我给每个人一个+1的想法:)