我在一个表中根据id收集具有不同类型值的相同类似数据:
+------+---------------+-----------------+----------------+
| id | TransID | Amount | InsertDate |
+------+---------------+-----------------+----------------+
| 1 | 1 | 12 | 19-03-2004 |
| 2 | 2 | 9 | 20-03-2004 |
| 3 | 3 | 4 | 21-03-2004 |
| 4 | 1 | 12 | 22-03-2004 |
| 5 | 2 | 9 | 23-03-2004 |
| 6 | 3 | 4 | 24-03-2004 |
| 7 | 1 | 12 | 25-03-2004 |
+------+---------------+-----------------+----------------+
当我根据TransID为1选择表时,我希望根据表的id为记录设置唯一的自动增量ID。
怎么做?所以结果将是
+------+---------------+-----------------+----------------+---------------
| id | TransID | Amount | InsertDate | NewGeneratedID
+------+---------------+-----------------+----------------+-----------------
| 1 | 1 | 12 | 19-03-2004 | 1
| 4 | 1 | 12 | 22-03-2004 | 2
| 7 | 1 | 12 | 25-03-2004 | 3
+------+---------------+-----------------+----------------+ ---------------
当我选择只有表格的特定id时,例如id为4,它会给我NewGeneratedID为2而不是1.
+------+---------------+-----------------+----------------+---------------
| 4 | 1 | 12 | 22-03-2004 | 2
+------+---------------+-----------------+----------------+
答案 0 :(得分:8)
您可以根据需要使用以下查询
var buf = Regex.Matches(data,@"\d+").Cast<Match>()
.Select(x => byte.Parse(x.Value))
.ToArray();
答案 1 :(得分:8)
我必须警告你,下一个查询效率低下,但它可以达到你所需要的效果。
SELECT t.id, t.TransID ,t.Amount, t.InsertDate,
(SELECT COUNT(id) FROM table1 AS aux
WHERE t.TransID = aux.TransID and aux.id <= t.id)
FROM table1 t
WHERE t.TransID = 1 ORDER BY id;
如果您需要的过程在时间上很关键,则不应使用此查询。但是,如果您只想获得一条记录,则最好使用以下有效的查询。
SELECT t.id, t.TransID , t.Amount, t.InsertDate, COUNT(*)
FROM table1 t inner join table1 aux where t.TransID = aux.TransID
WHERE aux.id <= t.id and t.id = 4
GROUP BY t.id, t.TransID , t.Amount, t.InsertDate;
更新:限制aux.id <= t.id
通过计算存在较少id的元素数来确定元素之间的顺序。例如,具有id 4 的行的一行具有较小的id(1)用于同一事务,而具有id 7 的行具有两行具有较小id(1和4的行) )
答案 2 :(得分:5)
如果您计划为其添加一列,则可以使用MySQL INSERT TRIGGER类似下面的内容:
CREATE TRIGGER INSERT_Trigger BEFORE INSERT ON Your_Table
FOR EACH ROW BEGIN
SET NEW.NewGeneratedID = (SELECT COUNT(*)+1 FROM Your_Table WHERE TransID = NEW.TransID);
END
编辑:策略是这样的,如果您使用NewGeneratedID
的物理列,那么对于表中的每个插入,计算TransID
已存在的ROW数量(新行)并按计数+ 1设置NewGeneratedID
(新行)。请记住,如果需要从表中删除,则必须使用AFTER DELETE触发器才能使NewGeneratedID
保持一致。
答案 3 :(得分:4)
根据TransactionID选择时使用以下查询
SELECT t.id,t.TransID ,t.Amount,t.InsertDate ,(@num:=@num+1) AS
NewGeneratedID FROM MyTable t
cross join (SELECT @num:=0) AS dummy where t.TransID=1 ORDER BY id;
对于id条件检查,请使用以下查询
select t1.* from
(SELECT t.id,t.TransID ,t.Amount,t.InsertDate,
(@num:=@num+1) AS NewGeneratedID
FROM MyTable t
cross join (SELECT @num:=0) AS dummy
where t.TransID=1 ORDER BY id) t1
where t1.id=4 ;
答案 4 :(得分:4)
这是我对你在问题中理解的建议:
如果为NewGeneratedID
生成的增量ID将是永久性的:
id
和
NewGeneratedID
如果为NewGeneratedID
生成的新ID只是暂时的:
id
和NewGeneratedID
答案 5 :(得分:0)
id字段是否已经足够独特?你为什么不用它?如果您绝对需要一个新字段,您只需在id字段中添加一个或任意数字,并在每个插入上生成另一个值。即New Field = ID + Constant。