Mysql更新和排序列表

Mysql更新和排序列表,mysql,Mysql,初始表格“我的产品” pr_id sort_pr group_pr 321 -1 2 422 -2 2 621 -3 2 921 -4 2 753 -5 2 713 -6 2 573 -7 2 570 -8 2 521 -9 2 901

初始表格“我的产品”

pr_id   sort_pr   group_pr
 321      -1         2
 422      -2         2
 621      -3         2
 921      -4         2
 753      -5         2
 713      -6         2
 573      -7         2
 570      -8         2
 521      -9         2
 901      -1         3
例如,用户在网站上工作以从列表中删除某些产品时

pr_id   sort_pr   group_pr
 321      -1         2
 753      -5         2
 573      -7         2
 521      -9         2
 901      -1         3
我想对“sort_pr”列进行排序并得到结果,如下所示:

pr_id   sort_pr   group_pr
 321      -1         2
 753      -2         2
 573      -3         2
 521      -4         2
 901      -1         3
这是我的要求:

UPDATE `my_product` SET time_column=sort_pr, sort_pr='-1' WHERE group_pr='2' 
UPDATE `my_product` SET sort_pr=(SELECT MIN(sort_pr))-1, time_column='0' WHERE group_pr='2' ORDER BY time_column DESC
但它不起作用


是否可以在一次更新中对列表进行排序并保存顺序?

我已经为您编写了查询。我希望它能解决您的问题:

SELECT 
    pr_id, cnt
FROM
    (SELECT 
        pr_id,
            @prevgrouppr,
            CASE
                WHEN group_pr != @prevgrouppr THEN @rownum:=- 1
                ELSE @rownum:=@rownum - 1
            END AS cnt,
            @prevgrouppr:=group_pr
    FROM
        my_product
    CROSS JOIN (SELECT @rownum:=0, @prevgrouppr:=0) r) AS t
用于更新

UPDATE my_product
        LEFT JOIN
    (SELECT 
        pr_id,
            @prevgrouppr,
            CASE
                WHEN group_pr != @prevgrouppr THEN @rownum:=-1 ELSE @rownum:=@rownum - 1
            END AS cnt,
            @prevgrouppr:=group_pr
    FROM
        my_product
    CROSS JOIN (SELECT @rownum:=0, @prevgrouppr:=0) r) AS t ON t.pr_id = my_product.pr_id 
SET 
    my_product.sort_pr = t.cnt
;

检查

我已经为您写下了查询。我希望它能解决您的问题:

SELECT 
    pr_id, cnt
FROM
    (SELECT 
        pr_id,
            @prevgrouppr,
            CASE
                WHEN group_pr != @prevgrouppr THEN @rownum:=- 1
                ELSE @rownum:=@rownum - 1
            END AS cnt,
            @prevgrouppr:=group_pr
    FROM
        my_product
    CROSS JOIN (SELECT @rownum:=0, @prevgrouppr:=0) r) AS t
用于更新

UPDATE my_product
        LEFT JOIN
    (SELECT 
        pr_id,
            @prevgrouppr,
            CASE
                WHEN group_pr != @prevgrouppr THEN @rownum:=-1 ELSE @rownum:=@rownum - 1
            END AS cnt,
            @prevgrouppr:=group_pr
    FROM
        my_product
    CROSS JOIN (SELECT @rownum:=0, @prevgrouppr:=0) r) AS t ON t.pr_id = my_product.pr_id 
SET 
    my_product.sort_pr = t.cnt
;

检查

为什么要对其进行排序?相反,当您在某处实际显示它时,只需通过执行
SELECT
语句对其进行排序即可。这会更容易。迪彭·沙阿,问题是“sort_pr”在本地数据库中是键,或者不是键,你仍然可以对它进行排序。你为什么要对它进行排序?相反,当您在某处实际显示它时,只需通过执行
SELECT
语句对其进行排序即可。这会更容易。迪彭·沙阿,问题是“sort_pr”在本地数据库中是键,或者不是键,你们仍然可以对它进行排序。