我在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 |
+------+
请注意,这不是线程安全的,因此请将其全部包装在事务/触发器中。
希望能有所帮助。