2012-06-29 41 views
0

我有表有bok-inv-MySQL的更新域與一些前綴

id | number 
1 | bok-1 
2 | inv-3 
3 | bok-2 
4 | inv-2 
5 | inv-10 
6 | bok-3 

它如何分類與inv-前綴領域number前綴?
在這種情況下,結果將是:

id | number 
1 | bok-1 
2 | inv-1 
3 | bok-2 
4 | inv-2 
5 | inv-3 
6 | bok-3 

回答

1

你可以只使用MySQL的SUBSTRING()功能:

ORDER BY CAST(SUBSTRING(number, 5) AS SIGNED) 

看到它的sqlfiddle

但是,它可能會更好地存儲在單獨的列前綴和整數部分,如果可能的話:

ALTER TABLE mytable 
    ADD COLUMN prefix ENUM('bok', 'inv'), 
    ADD COLUMN suffix INT; 

UPDATE mytable SET 
    prefix = LEFT(number, 3), 
    suffix = SUBSTRING(number, 5); 

ALTER TABLE mytable 
    DROP COLUMN number; 
+0

我不明白你在sqlfiddle上做了什麼,有我在那裏看到的變化@ _ @ – GusDeCooL

+0

@GusDeCool:對不起? – eggyal

+0

您在sqlfiddle中製作的腳本中,我沒有看到在那裏做任何更新。我只是看到你排序的數字。 – GusDeCooL

1

基本上你應該重新設計你的數據庫結構。不幸的是,沒有其他選項可能有效地處理這種情況,因爲數據庫不會索引那些破折號。所以在兩個領域分開是最常見的做法。否則,您將在每個order by子句上運行表掃描。

編輯:除了討論中的信息之外,您有:http://chat.stackoverflow.com/rooms/13241/discussion-between-eggyal-and-gusdecool很顯然,這是一個錯誤的設計,您所要求的操作根本不應該執行。

如果沒有創建一個體面的結構並以這種方式創建一個合法的解決方案,實現它將是不可能的。

+0

我不允許重新設計數據庫結構 – GusDeCooL

+0

然後你唯一的選擇是在你的查詢中做一些醜陋的事情,或者在別的地方保留一個單獨的索引。就是這樣。我可能不是一個錯誤的決定,但要確保你知道你爲什麼做到這一點。如果你不允許改變結構,你將不得不這樣做。儘管它可能會在您的數據庫中涉及未來的性能問題。 –