2013-02-12 55 views
0

樣品表使用SQL生成字符串

---------------------------     -------- 
| id | user | num | type | ---> Want to get | name | 
---------------------------     -------- 
| 5 | 1 | 2 | Q |     | Q2A | 
---------------------------     -------- 
| 10 | 1 | 2 | Q |     | Q2B | 
---------------------------     -------- 
| 11 | 1 | 2 | Q |     | Q2C | 
---------------------------     -------- 
| 12 | 2 | 2 | Q |     | Q2A | 
---------------------------     -------- 
| 14 | 1 | 3 | R |     | R3A | 
---------------------------     -------- 
| 17 | 2 | 3 | R |     | R3A | 
---------------------------     -------- 

說明

我有一個簡單的數據庫架構上,如左圖所示。我需要使用SQL根據值生成給定的名稱列。我已經想出如何CONCAT(type,num),但我不知道如何生成正確的信件。我知道這樣的東西在SQL中是可能的,因爲我很久以前做過類似的事情。

編號方案 對於每個用戶,爲具有相同numtype更多的行被找到,字母應當從A-Z進步。將永遠不會有更多的26,所以處理這是不是一個問題

我想我可以先生成數字(即1,2,3而不是A,B,C),然後做一些沿着SELECT 1 FROM [A..Z] ,我只是不確定如何在MySQL中完成此操作。

UPDATE

If I can get from here:     To: 
---------------------------     -------------- 
| id | user | num | type |     | name | seq | 
---------------------------     -------------- 
| 5 | 1 | 2 | Q |     | Q2 | 1 | 
---------------------------     -------------- 
| 10 | 1 | 2 | Q |     | Q2 | 2 | 
---------------------------     -------------- 
| 11 | 1 | 2 | Q |     | Q2 | 3 | 
---------------------------     -------------- 
| 12 | 2 | 2 | Q |     | Q2 | 1 | 
---------------------------     -------------- 
| 14 | 1 | 3 | R |     | R3 | 1 | 
---------------------------     -------------- 
| 17 | 2 | 3 | R |     | R3 | 1 | 
---------------------------     -------------- 
Then its just a simple matter of using CHAR() 
+0

你能提供更多樣本數據嗎?你還會有Q3A,B和C嗎? – 2013-02-12 18:22:55

+1

分配字母的邏輯是什麼?你的例子並不明顯。 – 2013-02-12 18:33:44

+2

'| 11 | 1 | 2 | Q | | Q3A |'??? – SparKot 2013-02-12 18:34:36

回答

3

我認爲你正在尋找的東西是這樣的:

SELECT 
    id, user, num, type, seq 
FROM (
SELECT 
    sample.*, 
    @row:= case when @lst_type=type 
        and @lst_user=user 
        and @lst_num=num then @row+1 else 65 end, 
    CONCAT(type, num, CHAR(@row)) seq, 
    @lst_type:=type, 
    @lst_user:=user, 
    @lst_num:=num 
FROM sample, (select @lst_type:=null, 
        @lst_user:=null, 
        @lst_num:=null, 
        @row:=65) r 
ORDER BY id 
) s 

請參閱小提琴here

+0

+1 - 即使這不是OP想要的(誰知道?),喜歡使用CHAR! – sgeddes 2013-02-12 18:36:46

+0

是的,這個答案提供了很多見解,但我不小心遺漏了一個細節,使這個解決方案不工作:( – 2013-02-12 18:38:44

+0

@sgeddes謝謝:)這是很長一段時間,因爲我沒有使用CHAR :) – fthiella 2013-02-12 18:40:14