2013-02-21 62 views
1

我有一個分類表。
我有這樣在mysql中使用3個字符長度的大寫字符串更新列

id | name | symbol 
1  | Feeders | FEE 
2  | Ovens  | 
3  | Routers | 

記錄我在這個表中多條記錄。我想更新帶類別名稱的符號字段,就像這樣獲取類別名稱,提取3個隨機字符(必須按順序並且始終選擇帶有2個隨機字符的第一個字符),然後將它們轉換爲大寫並應用更新。我怎樣才能做到這一點。
例如,我想烤箱更新OVE或OVN或OVS或OEN或OES等
我如何在一個查詢中做到這一點。

這是我曾嘗試,但它有時也帶來了1個字符有時2,有時3

UPDATE category 
SET symbol = (select 
     upper(SUBSTRING(name, 1+ FLOOR(RAND()*LENGTH(name)),3)) 
      from default_category 
      where category_id = 2) 
where category_id = 2 
+1

請編輯您的帖子以包含您的解決方案。謝謝。 – bernie 2013-02-21 19:08:53

+0

@bernie我已經更新了這個問題,你能建議我失蹤了嗎? – 2013-02-21 19:25:02

+0

隨機選擇是否也必須是唯一的?例如:如果您有RouteLists作爲名稱,並且隨機選擇ROT作爲路由器,ROT也會被選爲喧賓奪主?如果它們必須是獨一無二的,那麼在新的獨特符號不能被雕刻的情況下,你想要發生什麼? – xQbert 2013-02-21 19:25:48

回答

1

你可以使用這樣的查詢來計算符號的隨機值:

SELECT 
    id, 
    name, 
    UPPER(CONCAT(
    LEFT(name,1), 
    SUBSTRING(name, FLOOR(r1), 1), 
    SUBSTRING(name, FLOOR(FLOOR(r1) + rand()*(LENGTH(name) - r1 DIV 1) + 1), 1))) symbol 
FROM (
    SELECT 
    id, 
    name, 
    case when LENGTH(name)<=3 THEN 2 ELSE rand()*(
    LENGTH(name)-2)+2 END r1 
    FROM 
    categories 
) s; 

,這可能是你UPDATE查詢:

UPDATE 
    categories INNER JOIN (
    SELECT 
     id, 
     name, 
     UPPER(CONCAT(
     LEFT(name,1), 
     SUBSTRING(name, FLOOR(r1), 1), 
     SUBSTRING(name, FLOOR(FLOOR(r1) + rand()*(LENGTH(name) - r1 DIV 1) + 1), 1))) symbol 
    FROM (
     SELECT 
     id, 
     name, 
     case when LENGTH(name)<=3 THEN 2 ELSE rand()*(
     LENGTH(name)-2)+2 END r1 
     FROM 
     categories 
    ) s 
) symb 
    ON categories.id=symb.id 
SET 
    categories.symbol = symb.symbol 

請參閱小提琴here

+0

,謝謝您的解決方案! – 2013-02-21 19:40:16

2

這是你在找什麼?

UPDATE YourTable 
SET symbol = UPPER(LEFT(name,3)) 
+0

這是偉大的,但隨機性呢?它將始終選擇前三個字符 – 2013-02-21 19:14:04

+0

爲了保持獨特性,您需要編寫一個循環來選擇隨機字母,查看以前使用過的內容,然後根據發現更新或重新調用 – Lance 2013-02-21 19:24:17

相關問題