使用SQL生成字符串

时间:2013-02-12 18:18:07

标签: mysql 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开始。永远不会有更多,所以处理这不是一个问题

我想我可以先生成数字(即1,2,3而不是A,B,C)然后按照SELECT 1 FROM [A..Z]的方式做一些事情,我只是不知道如何在的MySQL。

更新

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()

1 个答案:

答案 0 :(得分: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