2012-03-29 44 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

相关问题