有条件地填充新列

时间:2014-07-25 14:02:39

标签: mysql

我有一张这样的表:

[C1]  [C2]  [C3]  [C4]
  a1    b1    c1  val1    -- group 1
  a1    b1    c1  val2    -- group 1
  a1    b1    c1  val3    -- group 1

  a2    b2    c2  val1    -- group 2
  a2    b2    c2  val2    -- group 2

  a3    b3    c3  val1    -- group 3
  a3    b3    c3  val2    -- group 3

我想为[c5][c1][c2]的每个组合生成新列[c3]的值。所需的输出类似于:

[C1]  [C2]  [C3]  [C4]  [c5]
  a1    b1    c1  val1     1
  a1    b1    c1  val2     2
  a1    b1    c1  val3     3

  a2    b2    c2  val1     1
  a2    b2    c2  val2     2

  a3    b3    c3  val1     1
  a3    b3    c3  val2     2

对于[c1][c2][c3]的每一组,它们将始终相同。您可以将3列的组合视为主键。

1 个答案:

答案 0 :(得分:3)

这将需要两个查询。第一个查询你需要改变表来添加新列...我只是把这些varchar作为我的一面看起来像...

<强> SETUP:

CREATE TABLE my_table
(c1 VARCHAR(55) 
,c2 VARCHAR(55)
,c3 VARCHAR(55)
,c4 VARCHAR(55)
);

INSERT INTO my_table VALUES
  ('a1'  ,  'b1' ,   'c1',  'val1'),
  ('a1'  ,  'b1' ,   'c1',  'val2'),
  ('a1'  ,  'b1' ,   'c1',  'val3'),

  ('a2'  ,  'b2' ,   'c2',  'val1'),
  ('a2'  ,  'b2' ,   'c2',  'val2'),

  ('a3'  ,  'b3' ,   'c3',  'val1'),
  ('a3'  ,  'b3' ,   'c3',  'val2');

第一次查询:

ALTER TABLE my_table
    ADD COLUMN c5 VARCHAR(55);

这里我们刚刚添加了一个新列...称为c5。

第二次查询:

UPDATE my_table mt,
(
    SELECT 
        c4, 
        c1, 
        IF(@A = c1, @B := @B + 1, @B := 1) AS new_col, 
        @A := c1 
    FROM my_table
    CROSS JOIN(SELECT @A := '', @B := 1)t
) temp 
SET mt.c5 = new_col 
    WHERE mt.c4 = temp.c4 
    AND mt.c1 = temp.c1;

这里我们做一些计算,为每种类型增加一个计数,并在它到达一个新类型时重置。然后在同一查询中更新表

THIRD QUERY:

SELECT * FROM my_table;

只是查看所做更改的方法。

DEMO

<强>输出:

+---+---+---+-------+--+
|c1 |c2 |c3 |c4     |c5|
+---+---+---+-------+--+
|a1 |b1 |c1 |val1   |1 |
|a1 |b1 |c1 |val2   |2 |
|a1 |b1 |c1 |val3   |3 |

|a2 |b2 |c2 |val1   |1 |
|a2 |b2 |c2 |val2   |2 |

|a3 |b3 |c3 |val1   |1 |
|a3 |b3 |c3 |val2   |2 |
+---+---+---+-------+--+

<强>奖金:

只是为了好玩,如果您不想在表格中创建新列,也可以运行查询。像这样:

SELECT c1, c2, c3, c4, new_col as c5 
FROM
(
    SELECT 
        *, 
        IF(@A = c1, @B := @B + 1, @B := 1) AS new_col, 
        @A := c1 
    FROM my_table
    CROSS JOIN(SELECT @A := '', @B := 1)t
) as _outer_
相关问题