我有表有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
我有表有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
你可以只使用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;
基本上你應該重新設計你的數據庫結構。不幸的是,沒有其他選項可能有效地處理這種情況,因爲數據庫不會索引那些破折號。所以在兩個領域分開是最常見的做法。否則,您將在每個order by子句上運行表掃描。
編輯:除了討論中的信息之外,您有:http://chat.stackoverflow.com/rooms/13241/discussion-between-eggyal-and-gusdecool很顯然,這是一個錯誤的設計,您所要求的操作根本不應該執行。
如果沒有創建一個體面的結構並以這種方式創建一個合法的解決方案,實現它將是不可能的。
我不允許重新設計數據庫結構 – GusDeCooL
然後你唯一的選擇是在你的查詢中做一些醜陋的事情,或者在別的地方保留一個單獨的索引。就是這樣。我可能不是一個錯誤的決定,但要確保你知道你爲什麼做到這一點。如果你不允許改變結構,你將不得不這樣做。儘管它可能會在您的數據庫中涉及未來的性能問題。 –
我不明白你在sqlfiddle上做了什麼,有我在那裏看到的變化@ _ @ – GusDeCooL
@GusDeCool:對不起? – eggyal
您在sqlfiddle中製作的腳本中,我沒有看到在那裏做任何更新。我只是看到你排序的數字。 – GusDeCooL