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

C# 比较两列并在相同时增加计数,c#,mysql,windows,C#,Mysql,Windows,我正在使用MySQL数据库。我有两个专栏,分别是action和expected。我需要根据一个组合生成测试步骤ID,即当两个组合都是唯一的,然后添加一个新ID,比如TS01。但是当动作已经存在并且期望的是不同的时候,我需要一个像TS01-01这样的ID。下面是示例表。我没有找到任何方法来解决这个问题 +--------+----------+--------+ | Action | Expected | stepid | +--------+----------+--------+ | a

我正在使用MySQL数据库。我有两个专栏,分别是action和expected。我需要根据一个组合生成测试步骤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 |
+--------+----------+--------+

您需要第二个表来容纳每个操作的计数器

每次在上面的表中创建新条目时,都可以使用该计数器生成TS1-XX的索引

编辑:

好的,显然答案不够清楚

您有一个包含3列的表:Action、Expected和stepid

我把这张桌子叫做T1

你需要一张额外的桌子。。。我们称之为T2

使用列:Action、counter1和counter2

计数器1和计数器2是int列

计数器1->自动递增,从1开始

计数器2默认为0

现在,对于T1中的每个唯一操作,在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,你会发现每一个动作stepid都以TS1开头。。。对于每个动作,b stepid都以TS2开始

现在让我们考虑一下,对于每个操作,T1中有不止一行 如果该操作的计数器2为0,则stepid只是TSx部分

如果计数器2大于0,stepid为TSx YY,其中YY是计数器2值的两位数重复

对于为特定操作插入的每个唯一预期值,为该操作增加计数器2

现在看T2的计数器1,动作a和b。。。也就是说,a TS 1为1,b TS 2为2

现在让我们考虑一下,动作和期望可能不是唯一的,但在生成stepid时应该被视为唯一的

只需检查您要插入的元组是否已经在T1中,并从那里读取步骤ID(如果存在的话)。。。如果没有,请按照上面提到的方法生成stepid

编辑2:

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]

试着这样做:

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    
;

谢谢

我没有使用index.index!=SQL索引。。。我所说的索引是指添加到任何步骤id中的2位数字。。。请参考任何类似的帖子,因为我不知道索引。你把事情搞混了。。。忘了单词索引吧。。。在这种情况下称之为后缀。。。如果您有步骤ID TS1,并且添加了一些内容,使其成为TS1-01。。。某物-01是一个后缀。。。不要将它与数据库索引混淆,因为它与itOk无关。我可以生成XX。但是我将如何生成TS1Wait,您能详细说明一下吗?正如我所看到的,第四个动作“a”的stepid是TS1,而应该是TS1-03。我看到这个家伙这么说,没有反馈,但他想做的几乎和你一样@christia,它有TS1,因为表中已经存在该组合。而它的抓取已经分配给了我,我无法执行查询。select concat lineWait处的sql语法出错,您所说的唯一性是什么意思???a b出现两次,它们不是唯一的。顺便说一句,然后你说行动是存在的,预期是不同的??你的意思是什么,我的意思是这也适用于第一行。唯一的意思是,如果操作和预期的组合在db中已经存在,那么获取现有id,否则创建一个新id。从上面更新的ans中,我得到错误,因为t2.concat不存在。你的意思是,b在能行集合中出现两次,id将获得TSa-01的值,如果a,c出现一次,它将仅获得TSa的值,如果b,a出现三次,它将获得TSb-02的值,如下所示。上述查询的行为类似。查询t1/t2中的一个小更改将进入concate内部,即使现在我得到了语法错误。我使用的数据库是mysql