当前表格如下所示:
[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开始。
答案 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
是一个关键字,因此不是列名的最佳选择。您可以引用列名称或为其命名...