根据另一列将MySQL表列更新为连续数字

时间:2013-06-18 00:40:57

标签: mysql

当前表格如下所示:

[id | section | order | thing]
[1  | fruits  | 0     | apple]
[2  | fruits  | 0     | banana]
[3  | fruits  | 0     | avocado]
[4  | veggies | 0     | tomato]
[5  | veggies | 0     | potato]
[6  | veggies | 0     | spinach]

我想知道如何使表格更像这样:

[id | section | order | thing]
[1  | fruits  | 1     | apple]
[2  | fruits  | 2     | banana]
[3  | fruits  | 3     | avocado]
[4  | veggies | 1     | tomato]
[5  | veggies | 2     | potato]
[6  | veggies | 3     | spinach]
根据“section”列和“id”列,

“order”列更新为序列号,从1开始。

3 个答案:

答案 0 :(得分:1)

您可以使用update使用join执行此操作。连接的第二个表计算排序,然后用于更新:

update t join
       (select t.*, @rn := if(@prev = t.section, @rn + 1, 1) as rn
        from t cross join (select @rn := 0, @prev := '') const
       ) tsum
       on t.id = tsum.id
    set t.ordering = tsum.rn

答案 1 :(得分:0)

您不希望以UPDATE执行此操作,因为这会非常慢。

相反,请在INSERT上执行此操作。这是一个简单的单行INSERT,它将获取下一个订单号并在“fruits”部分插入一个名为“kiwi”的记录。

INSERT INTO `table_name` (`section`, `order`, `thing`)
SELECT 'fruits', MAX(`order`) + 1, 'kiwi'
FROM `table_name` 
WHERE `section` = `fruits`

编辑:您也可以使用插入触发器执行此操作,例如:

DELIMITER $$
CREATE TRIGGER `trigger_name` 
BEFORE INSERT ON `table_name`
FOR EACH ROW
BEGIN
    SET NEW.`order` = (SELECT MAX(`order`) + 1 FROM `table_name` WHERE `section` = NEW.`section`);
END$$
DELIMITER ;

然后您可以像往常一样插入记录,然后他们会自动更新order值。

INSERT INTO `table_name` (`section`, `thing`)
VALUES ('fruits', 'kiwi')

答案 2 :(得分:0)

您可以派生出来,而不是存储订单:

SELECT t.id
      ,t.section
      ,@row_num := IF (@prev_section = t.section, @row_num+1, 1) AS ordering
      ,t.thing
      ,@prev_section := t.section
  FROM myTable t
      ,(SELECT @row_num := 1) x
      ,(SELECT @prev_value := '') y
  ORDER BY t.section, t.id

请注意,order是一个关键字,因此不是列名的最佳选择。您可以引用列名称或为其命名...

相关问题