我在mysql中有一个简单的表,该表具有不同的记录类型,由ptype列中的值来区分

我的桌子看起来像这样

id1 ... ptype..usr ...项目
1 ..... 43 ....... 2 ...... 7001
2 ..... 44 ....... 2 ...... 8001
3 ..... 43 ....... 2 ...... 7002
4 ..... 43 ....... 2 ...... 7003
5 ..... 43 ....... 3 ...... 7001

添加新记录时,我需要查询以基于item且特定于ptype的方式在usr列中插入自动递增的值。即如果我插入新记录
id1 ... ptype..usr ...项目
6 ..... 43 ....... 3 ......?

它将为现有的ptype = 43和usr = 3的最高数字加1
id1 ... ptype..usr ...项目
6 ..... 43 ....... 3 ...... 7002

如果我们为ptype = 44和usr = 2添加了另一条记录
id1 ... ptype..usr ...项目
7 ..... 44 ....... 2 ...... 8002

我认为我应该这样做,首先使用item空白插入新记录,然后使用CASE WHEN THEN方法使用从新记录(即@lastid)派生的信息更新该记录,但是它不起作用。

SET @lastid := LAST_INSERT_ID();

SET @ptype =  (SELECT `ptype` FROM a1 WHERE `id1` = @lastid);

SET @item =  (SELECT (
CASE
when @ptype = 41 then (SELECT 1 + coalesce((SELECT max(`item`) FROM `a1` WHERE `ptype` = 41 AND `plate`=7 AND `userid` = @userid), 5000))
when @ptype = 42 then (SELECT 1 + coalesce((SELECT max(`item`) FROM `a1` WHERE `ptype` = 42 AND `plate`=7 AND `userid` = @userid), 6000))
when @ptype = 43 then (SELECT 1 + coalesce((SELECT max(`item`) FROM `a1` WHERE `ptype` = 43 AND `plate`=7 AND `userid` = @userid), 7000))
when @ptype = 44 then (SELECT 1 + coalesce((SELECT max(`item`) FROM `a1` WHERE `ptype` = 44 AND `plate`=7 AND `userid` = @userid), 8000))
when @ptype = 45 then (SELECT 1 + coalesce((SELECT max(`item`) FROM `a1` WHERE `ptype` = 45 AND `plate`=7 AND `userid` = @userid), 9000))
when @ptype = 46 then (SELECT 1 + coalesce((SELECT max(`item`) FROM `a1` WHERE `ptype` = 46 AND `plate`=7 AND `userid` = @userid), 10000))
ELSE 0
end) as item
from
a1 WHERE `id1` = @lastid);


更新a1设置item = @item ID1 = @lastid

照原样,@ item最初返回的值是0,无论新记录具有什么“ ptype”,并且对于后续条目,其递增1。...我需要在每个ptype中添加的第一条记录为5001 6001、7001等

最佳答案

首先,您没有提出的答案:通过在自己的表中创建行来扭转想法(建议使用AUTO_INCREMENT作为eggal),然后将数据移至该表。

现在的答案是:

您的信息有点不匹配,这可能解释了该问题,或者只是一团糟。例如,您没有描述什么是“盘子”,而是在查询中使用它。您还使用@userid,在示例中未设置。

我创建了一个表,该表似乎在顶部与您的数据匹配:

create table a1 (
  id1 int primary key auto_increment,
  ptype int,
  usr int,
  item int
);


然后设置您想要的变量:

set @userid = 2;
set @ptype = 43;


并插入一行:

insert into a1 (ptype, usr) values (@ptype, @userid);


像您一样拉回ID:

SET @lastid := LAST_INSERT_ID();


然后,您可以获得最大的“ item”:

select max(item) from a1  WHERE `ptype` = @ptype AND `usr` = @userid;


要处理最初的情况,您需要一个默认值。由于将ptype分隔为1000,因此可以使用:

SELECT ifnull(max(`item`),(@ptype % 40 + 2)*1000)+1 as next
FROM `a1`
WHERE `ptype` = @ptype
AND `usr` = @userid;

+------+
| next |
+------+
| 5001 |
+------+


请注意,这不是线程安全的,因此请将其全部包装在事务/触发器中。

希望能有所帮助。

08-04 22:38