样本表
--------------------------- --------
| 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中是可行的,因为我很久以前就做过类似的事情了。
编号方案
对于每个用户,当找到具有相同num
和type
的更多行时,字母应从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()
答案 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。