分类批量更新:MySql

时间:2018-03-08 12:31:00

标签: mysql sql mysql-5.6

我有一个文章表,用于保存每篇文章的类别 我想更新排序顺序,但是使用单个查询进行分类 我使用它来使用批量插入进行数据迁移并更新,因此循环数据不是一个可行的解决方案。

id      category_id         sort_order
10          5                   1
11          5                   2
12          5                   3
13          6                   1
14          6                   2
15          6                   3
16          7                   1
17          8                   1
18          8                   2
19          7                   2
20          8                   3

是否可以在单个查询中执行此操作?

我已经在所有行上按顺序编写了更新查询。但无法按类别进行。我写的查询在

下面
SET @so = 0;
UPDATE article A
INNER JOIN  category M ON A.category_id = M.id
SET A.sort_id = (@i := @i + 1)
WHERE A.user_id = 1;

SQLFIDDLE

1 个答案:

答案 0 :(得分:0)

我使用带有复合主键的临时表来自动生成递增的sort_order字段......

http://sqlfiddle.com/#!9/3d59fe/1

-- populate test data
CREATE TABLE cp (id  INT PRIMARY KEY, 
    category_id   INT,
    sort_order INT);

INSERT INTO cp VALUES
(10,          5,                    1), 
(11,          5,                    2), 
(12,          5,                    3), 
(13,          6,                    1), 
(14,          6,                    2), 
(15,          6,                    3), 
(16,          7,                    1), 
(17,          8,                    1), 
(18,          8,                    2), 
(19,          7,                    2), 
(20,          8,                    3);

-- create temp table and generate sort order
CREATE TABLE tmp (
    id INT NOT NULL,
    category_id   INT NOT NULL,
    sort_order INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (category_id,sort_order)
    ) ENGINE=MyISAM;


INSERT INTO tmp (id, category_id) 
SELECT id, category_id FROM cp 
ORDER BY rand();

-- update original table
UPDATE cp JOIN tmp USING (id)
SET cp.sort_order = tmp.sort_order;