2011-10-02 74 views
0

我有一張表,我想爲每條記錄應用一個價格等級。MySQL根據另一個字段的順序應用每行的字段值

1爲最高,2爲下一個最高,3爲下一個最高。

目前我選擇各行,然後更新每個記錄單獨像這樣:

用法:功能get_list(「表」,「順序字段」,「順序方向」) - 返回關聯數組

foreach(get_list('ps2','price','DESC') as $p) 
{ 
    $ct++; 
    $s = "UPDATE `ps2` 
      SET `price_rank` = '".$ct."' 
      WHERE `db_id` = '".$p[db_id]."' 
      LIMIT 1"; 
    mysql_query($s); 
} 

由於我有很多記錄,這是非常緩慢的,有沒有另一種方式?

編輯: 下面是一種方式更快,但有沒有更好的方法?

ALTER TABLE `ps2` DROP `price_rank` ; 
ALTER TABLE `ps2` CHANGE `db_id` `db_id` INT(11) NOT NULL ; 
ALTER TABLE `ps2` DROP PRIMARY KEY ; 
ALTER TABLE `ps2` ORDER BY `price_per_pax_after_tax` DESC; 
ALTER TABLE `ps2` ADD `price_rank` INT NOT NULL AUTO_INCREMENT PRIMARY KEY; 
ALTER TABLE `ps2` ORDER BY `db_id`; 
ALTER TABLE `ps2` CHANGE `price_rank` `price_rank` INT(11) NOT NULL ; 
ALTER TABLE `ps2` DROP PRIMARY KEY ; 
ALTER TABLE `ps2` ADD PRIMARY KEY (`db_id`) ; 
ALTER TABLE `ps2` CHANGE `db_id` `db_id` INT(11) NOT NULL AUTO_INCREMENT ; 
+1

您在這裏沒有提供足夠的信息,我們需要了解如何計算價格等級以便將其應用於表格。乍看起來,它應該可以用更新/案例說明來處理,但是再次,沒有更多細節,很難給出具體的答案。 – Icarus

回答

1

就我個人而言,我會使用像MAX這樣的集合函數和limit和offset來處理DML語句中的排名,以獲得我想要的結果。 另外,當價格變化時,如果將它們存儲在表格中,則必須重新填充等級值。 上述當前方法不處理相同的價格。

您可以返回排名沒有與此

SELECT p.db_id, COUNT(DISTINCT p2.price) as Rank 
FROM packages_sorted as p 
JOIN packages_sorted as p2 ON p.price <= p2.price 
GROUP BY p.db_id 

儲存它,如果你仍然想存儲軍銜,

UPDATE FROM packages_sorted as p JOIN (
    SELECT p.db_id, COUNT(DISTINCT p2.price) as PriceRank 
    FROM packages_sorted as p 
    JOIN packages_sorted as p2 ON p.price <= p2.price 
    GROUP BY p.db_id 
) as pSub ON p.db_id = pSub.db_id 
SET p.price_rank = pSub.PriceRank 

這些語句的兩個處理identicle價格與數量不同。

+0

感謝但有超過一百萬條記錄,第一個查詢仍在運行(10分鐘後!) 丟棄的PRIMARY KEY技術可能很難看,但它已經結束了一秒鐘。 –

+0

考慮價格和db_id的索引。我也錯過了p。來自Group By子句。 –

+0

我有索引,並找出p.db_id。關鍵是時間,我每小時更換10,000,000條記錄,然後處理它們。非常感謝您的幫助,但由於表格每小時都會重建,我認爲我必須堅持放棄主要方法並更換方法。我也同意,這個計算應該使用集合函數完成,但是我正在編寫中間件來生成CSV文件,而且我堅持這種可笑的數據複製。 –

相關問題