1

当前表如下所示:

[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]

"order" 列更新为一个序列号,从 1 开始,基于 "section" 列和 "id" 列。

4

3 回答 3

1

您可以update通过使用 a来执行此操作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
于 2013-06-18T01:38:59.630 回答
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')
于 2013-06-18T00:47:39.670 回答
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是一个关键字,因此对于列名来说不是最大的。您可以引用列名或给它一个不同的名称...

于 2013-06-18T01:28:11.920 回答