2012-03-29 38 views
0

我正在尋找最有效的方法來更新where和order by語句所選擇的行數,以便將位置1到n保存到這些行中。對於排序字段中的相同值,應該有相同的位置,但是接下來的位置將不得不被跳過。使用MySQL有效地將升序保存到行數

ID, catagory_id, price, position 
1, 1,   19.99, NULL 
2, 2,   9.99, NULL 
3, 1,   9.99, NULL 
4, 1,   9.99, NULL 
5, 1,   2.99, NULL 

UPDATE stuff SET position=XXX WHERE category_id = 1 ORDER BY price ASC 

ID, catagory_id, price, position 
1, 1,   19.99, 4 
2, 2,   9.99, NULL 
3, 1,   9.99, 2 
4, 1,   9.99, 2 
5, 1,   2.99, 1 

注意position=2設置兩次,因此省略position=3

單個SQL查詢可能嗎?我不想爲每行發佈更新聲明,因爲我將不得不每日更新數以百萬計的數據。

不相同的位置上,我用:

SELECT @row:=0; 
    UPDATE offers SET position = (@row:[email protected]+1) WHERE category_id = 1 ORDER BY price ASC; 

回答

0

你的問題不明確。據我所知,你想用特定行中特定行的等級填充位置列。

[1] Initinalize:

SELECT @pos:=0, @prev_price:=-1.0, @omitted:=0;

[2]使用此查詢來獲取所需的位置編號:

SELECT id, IF(price > @prev_price, @pos:[email protected][email protected]+1, @pos) AS position, IF(@prev_price = price, @omitted:[email protected]+1, @omitted:=0), @prev_price:=price FROM offers WHERE category_id = 1 ORDER BY price ASC;

[3]現在的結果集做INSERT .... ON DUPLICATE KEY UPDATE

INSERT INTO offers (id, position) SELECT A.id, A.position FROM (SELECT id, IF(price > @prev_price, @pos:[email protected][email protected]+1, @pos) AS position, IF(@prev_price = price, @omitted:[email protected]+1, @omitted:=0), @prev_price:=price FROM offers WHERE category_id=1 ORDER BY price ASC) AS A ON DUPLICATE KEY UPDATE position = A.position;

+0

差不多,但我想以不同的方式在相同的價格下行多行。而不是1,2,2,3,我想1,2,2,5。我調整了你的答案並糾正了一些錯別字。感謝您的回答。這對我很有幫助。 – Jan 2012-03-31 11:21:09

相關問題