2015-09-03 35 views
1

最初表「my_product」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  -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 

但它不工作...

是否有可能一個列表排序,並保存在一個更新的順序?

+2

你爲什麼要排序呢?相反,只需通過編寫一條'SELECT'語句在某處顯示它就可以對其進行排序。這會更容易tbh。 –

+0

Dipen Shah,問題是'sort_pr'是本地數據庫中的密鑰 – user3710480

+0

鍵或不是鍵,您仍然可以對其進行排序。 –

回答

0

我已經爲您寫了查詢。我希望這將解決您的問題:

SELECT 
    pr_id, cnt 
FROM 
    (SELECT 
     pr_id, 
      @prevgrouppr, 
      CASE 
       WHEN group_pr != @prevgrouppr THEN @rownum:=- 1 
       ELSE @rownum:[email protected] - 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:[email protected] - 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 
; 

檢查SQLFiddle

+0

非常感謝! – user3710480

+0

@ user3710480你的問題解決了嗎? –

+0

如果它已解決您的問題,請upvote此結果..... –