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