比较两列并在相同时增加计数

时间:2014-03-05 07:10:16

标签: c# mysql windows

我正在使用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 |
+--------+----------+--------+

2 个答案:

答案 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    
;

由于