2011-03-24 61 views
0

我在MySQL這樣的表:按順序編號由

name  position 
apple 0 
banana 0 
candy 0 

我想更新它看起來像這樣:

name  position 
apple 1 
banana 2 
candy 3 

也就是說,我要更新列position以指示當按字母順序排列name時該行的位置。我真的,真的,真的喜歡做這個沒有使用變量。而且,真正的表格中有1000個條目,所以如果程序適度有效,這將有所幫助。

+0

所以你的意思是按字母順序排列表,然後爲每一行插入正確的位置編號? – 2011-03-25 00:00:15

回答

2

沒有使用變量的mysql沒有解決方案。

既然你問:「喜歡做沒有使用變量」 - 那麼最終的答案是「這是在MySQL中是不可能的」

無論如何,這是變量的解決方案,只是要注意:

select name, 
     @I := @I + 1 
    from tblname, 
     (select @I := 0) x; 
+0

其他人感覺不同。 – Malvolio 2011-03-25 00:27:13

+1

@Malvolio:選中的答案不會與重複進行處理。如果你有任何重複(你沒有提到任何一列是否是唯一的,所以我們提到可能存在) - 那麼你會得到錯誤的立場。 – zerkms 2011-03-25 01:08:52

2

,不使用變量:

SELECT a.name, 
     (SELECT COUNT(*) 
      FROM YOUR_TABLE b 
      WHERE b.name <= a.name) AS position 
    FROM YOUR_TABLE a 
ORDER BY position 

的問題是,重複將獲得相同的位置編號。

變量是獲取不重複的位置值是唯一的選擇:

SELECT a.name, 
     @rownum := @rownum + 1 AS position 
    FROM YOUR_TABLE a 
    JOIN (SELECT @rownum := 0) r 

...而無需創建了一個名爲position列設置爲AUTO_INCREMENT表。

MySQL不支持ROW_NUMBER之類的分析函數,這是你在這種情況下使用的。

+0

「,而不創建一個表,並將列設置爲AUTO_INCREMENT。嗯,我爲什麼要這樣做沒有... – Malvolio 2011-03-25 00:28:36

+0

碰巧,在我的問題,重複*應*獲得相同的位置編號。 – Malvolio 2011-03-25 00:31:52

+3

@Malvolio:好吧,「重複應該得到相同的位置」 - 你必須在問題中指定這個,在你指責answerers之前,好嗎? – zerkms 2011-03-25 01:11:53

2

它在純SQL中可行。嘗試類似:

UPDATE mytable AS master SET position = (
    SELECT COUNT(*) FROM mytable AS counter WHERE counter.name < master.name 
); 

高效?哈。但即使有1000個條目被認爲是「小」表,所以它會比你想象的要快。

希望這會有所幫助!

PS:說不上什麼你使用本作,但它很可能,你可以與mytable.name索引和LIMIT條款做得更快,更efficently。

+0

我(大致)在每個人的描述中寫下一條信息,說:「恭喜,你是#* n *」 - 所以'LIMIT'對我來說什麼都不會做。 – Malvolio 2011-03-25 00:26:43

+0

如果可以的話,我會爲fencepost錯誤取一個1/4的點:第一行將用你的方法編號爲0,而不是1. – Malvolio 2011-03-25 00:31:15

+0

也要注意,這樣的查詢比具有變量的查詢性能低。 – zerkms 2011-03-25 01:17:20