我正在使用MySQL db。我有2列动作和预期。我需要根据一个组合生成测试步骤ID,即当两个组合都是唯一的时,然后添加一个新ID,即TS01。但是当行动已经存在且预期不同时,我需要拥有像TS01-01这样的ID。以下是样本表。我找不到任何方法来解决这个问题。
+--------+----------+--------+
| Action | Expected | stepid |
+--------+----------+--------+
| a | b | TS1 |
| a | c | TS1-01 |
| a | d | TS1-02 |
| a | b | TS1 |
| b | a | TS2 |
| b | c | TS2-01 |
+--------+----------+--------+
答案 0 :(得分:0)
您需要第二个表来为每个操作保留一个计数器
每次在上表中创建新条目时,都可以使用该计数器生成TS1-XX的索引
编辑:
好的,显然答案还不够明确......你有一个包含3列的表:Action,Expected和stepid
我将此表称为
你需要一张额外的桌子......我们称之为T2
列:Action,counter1和counter2
counter1和counter 2是int列
counter1 - >自动增量,从1开始
计数器2默认为0
现在对于T1中的每个唯一Action,在T2中创建一个新行
你可以看到你会得到这样的T2
+--------+----------+----------+
| Action | counter1 | counter2 |
+--------+----------+----------+
| a | 1 | 0 |
| b | 2 | 0 |
| c | 3 | 0 |
| d | 4 | 0 |
+--------+----------+----------+
现在回到T1
+--------+----------+--------+
| Action | Expected | stepid |
+--------+----------+--------+
| a | b | TS1 |
| a | c | TS1-01 |
| a | d | TS1-02 |
| a | b | TS1 |
| b | a | TS2 |
| b | c | TS2-01 |
+--------+----------+--------+
如果你仔细看看stepid,你可以看到,对于每个Action,stepid以TS1开头......对于每个动作,b stepid以TS2开头......
现在让我们考虑一下T1中每个Action都有多行 如果该操作的counter2为0,则您的stepid只是TSx部分
如果counter2大于0,则stepid为“TSx-YY”,其中YY是counter2值的两位数重复...
为每个唯一的“Expected”插入特定的Action,为该操作增加counter2
现在查看T2的counter1表示动作a和b ... 1 表示“a”(TS 1 )且 2 对于“b”(TS 2 )
现在让我们考虑一下,Action和Expected可能不是唯一的,但在stepid生成时应该被视为唯一
只需检查您要插入的元组是否已经在T1中并从那里读取步骤ID(如果存在)...如果不存在,则按照上面提到的方式生成stepid
EDIT2:
n是插入T1的新行,而n [action]是新行的列操作,等等。
m是从T2检索的行,如果没有返回行,则返回null
用于在T1中插入行的伪代码:
if (Execute SQL returns a row: SELECT * FROM T1 WHERE action = n[action] and expected = n[expected])
return // do not insert twice, or as an alternative, fetch that stepid and use it
m <- Execute SQL: SELECT * FROM T2 where action = n[action]
if( m == null )
{
Execute SQL: INSERT INTO T2 SET action = n[action]
m <- Execute SQL: SELECT * FROM T2 where action = n[action]
}
//m has a row now
_stepid = "TS"
_stepid += m[counter1].ToString()
if( m[counter2] > 0 )
{
_stepid += "-"
_stepid += m[counter2].ToString("D2") // will get 3 as "03" and 11 as "11"
}
Execute SQL: INSERT INTO T1 SET action = n[action], expected = n[expected], stepid = _stepid
Execute SQL: UPDATE T2 set counter2=counter2 + 1 WHERE action = n[action]
答案 1 :(得分:0)
尝试这样的事情:
SELECT
`Action`, `Expected`,
(
SELECT concat("TS",`Action`,if(count(*)=1,"",concat("-",count(*)-1)))
FROM <table> t2
WHERE
concat(t2.`Action`,t2.`Expected`)=concat(t1.`Action`,t1.`Expected`)
) as `step_id`
FROM
<table> t1
;
由于