我在MySQL這樣的表:按順序編號由
name position
apple 0
banana 0
candy 0
我想更新它看起來像這樣:
name position
apple 1
banana 2
candy 3
也就是說,我要更新列position
以指示當按字母順序排列name
時該行的位置。我真的,真的,真的喜歡做這個沒有使用變量。而且,真正的表格中有1000個條目,所以如果程序適度有效,這將有所幫助。
我在MySQL這樣的表:按順序編號由
name position
apple 0
banana 0
candy 0
我想更新它看起來像這樣:
name position
apple 1
banana 2
candy 3
也就是說,我要更新列position
以指示當按字母順序排列name
時該行的位置。我真的,真的,真的喜歡做這個沒有使用變量。而且,真正的表格中有1000個條目,所以如果程序適度有效,這將有所幫助。
,不使用變量:
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之類的分析函數,這是你在這種情況下使用的。
它在純SQL中可行。嘗試類似:
UPDATE mytable AS master SET position = (
SELECT COUNT(*) FROM mytable AS counter WHERE counter.name < master.name
);
高效?哈。但即使有1000個條目被認爲是「小」表,所以它會比你想象的要快。
希望這會有所幫助!
PS:說不上什麼你使用本作,但它很可能,你可以與mytable.name
索引和LIMIT
條款做得更快,更efficently。
所以你的意思是按字母順序排列表,然後爲每一行插入正確的位置編號? – 2011-03-25 00:00:15