2014-07-16 30 views
2

示例表:是否有可能使用regexp替換對mysql表進行排序?

ID Name 
1 Apple Color: Yellow 
2 Apple Color: Red 
3 Banana Color: Yellow 
4 Banana Color: Brown 
5 Apple Color: Yellow 

是否可以訂購這份名單的名字,但只取水果名字進去,通過刪除「顏色:凡是」的一部分?那麼結果會是這樣嗎?

ID Name 
1 Apple 
2 Apple 
5 Apple 
3 Banana 
4 Banana 

「僞」 會是這樣我猜:

select * from fruits order by REGEXP_REPLACE(name, '/ Color:.*/', '') asc 
+1

爲什麼不只是'ORDER BY Name ASC' ?? –

+0

,因爲我最終會在水果總數後排序。 –

+0

即使如此,不知道爲什麼正則表達式順序會與正常順序不同。我很好奇,如果您可以提供一些數據我想測試它:) –

回答

0

簡短的回答,沒有,不是沒有UDF - How to do a regular expression replace in MySQL?

正如他的回答,您可以提及@LLPrudente使用SUBSTRING_INDEX如果所涉及的字段在冒號之後總是具有顏色而沒有別的。擴大了他的建議,你可以做以下

... ORDER BY TRIM(SUBSTRING_INDEX(name, ':', -1)) 

最後一個稍微好一點的答案,真的這些都應該被存儲爲兩個不同的領域,即「名稱」和而不是這個「顏色」。它可能是你已經清理了數據,並使得它看起來好像這個數據可以更好地呈現,並且很可能在你的實際數據集中出現這種情況。考慮回顧並重新思考你的結構,因爲上述不會是最有效的方法。

0

這裏是計算不同水果(果實的總數)的半簡單的方式。

SELECT COUNT(DISTINCT LEFT(`name`, LOCATE("Color:", `name`)-1)) as total_fruits 
FROM exampe_table; 

說實話你想正常化你的數據庫..你可以添加另一個表來匹配顏色,甚至重做這個表並添加另一列。這將是對一個側面說明這樣做

CREATE TABLE fruits_n_colors 
(`id` int, `name` varchar(255), `color` varchar(255)) 
    SELECT id, 
     SUBSTRING_INDEX(Name, ' Color: ', 1) as name, 
     SUBSTRING_INDEX(Name, ' Color: ', -1) as color 
    FROM exampe_table 
    ORDER BY id; 

DEMO


如果您想保留目前的表,那麼你可以改變一個最簡單的方式,然後更新,像這樣

ALTER TABLE exampe_table 
    ADD COLUMN `fruit` VARCHAR(55), 
    ADD COLUMN `color` VARCHAR(55); 

UPDATE exampe_table et, 
(
    SELECT 
     id, 
     SUBSTRING_INDEX(Name, ' Color: ', 1) AS fruit, 
     SUBSTRING_INDEX(Name, ' Color: ', -1) AS color 
    FROM exampe_table 
)t 
SET et.fruit = t.fruit, et.color = t.color WHERE et.id = t.id; 

ALTER TABLE exampe_table 
    DROP COLUMN `Name`; 

ANOTHER DEMO

相關問題