0

样品表

---------------------------                  --------
| 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的行,字母应该从 AZ 开始。永远不会超过 26 个,所以处理这不是问题

我想我可以首先生成数字(即 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()
4

1 回答 1

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

请看这里的小提琴。

于 2013-02-12T18:31:49.130 回答