2010-02-06 26 views
0

MySQL的:加入給定一個表中的位置列

id | score | position 
===================== 
1 | 20 |  2 
2 | 10 |  3 
3 | 30 |  1 

我可以使用哪些查詢優化設置使用(不可爲空),得分列位置的列?

(我敢肯定,我以前見過,但我似乎無法得到正確的關鍵字找到它!)

回答

3
set @rank = 0; 
update tbl a join (select score, @rank:[email protected]+1 as rank from tbl group by score 
    order by score desc) b on a.score = b.score set a.position = b.rank; 

更新一舉的位置,會做的招。平分得到相等的位置

+0

啊,謝謝,看起來像它和'排名'是我應該早些時候使用的關鍵字! – Pool

1

用你正在使用的語言計算它。因此,您的解決方案將是:

  • 更便攜
  • 更具可讀性
  • 等效高效
+0

謝謝,但我正在尋找類似於此的解決方案:http://stackoverflow.com/questions/1600294/mysql-add-sequence-column-based-on-another-field – Pool

+0

我試圖暗示爲什麼這樣一個解決方案是不是更可取:) – Bozho

1
SELECT * FROM your_table ORDER BY score; 

您的位置列似乎是多餘的,儘管很難從信息告訴在問題中給出。您看起來想要的功能是使用數據庫行排序來完成的,在上面的例子中用'ORDER BY'表達式來看。即使您想要某個位置列出於某種原因,請記住最有可能存在索引的列,無論如何,這在大多數情況下都會執行與位置列完全相同的操作。要麼,要麼我完全誤解你的問題。

+0

謝謝阿姆,是的,位置是一個多餘的,但我需要使用它進行優化。位置列將是一個緩存的位置值,很少創建。 (每次我希望獲得該職位時進行排序非常昂貴,例如每5分鐘設置一次,例如罰款) – Pool

+0

當您明確告訴它將索引評分列時,數據庫系統本身可以更好地進行優化使用下面的SQL表達式: CREATE INDEX score_index ON your_table(score); – amn

+0

我已經有得分作爲索引。 – Pool

相關問題