0

我在 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...item
6.....43........3......?

对于 ptype=43 和 usr=3 id1...ptype..usr...item
6.....43....3...... 7002

如果我们为 ptype=44 和 usr=2 添加另一条记录 id1...ptype..usr...item
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 SET item= @item WHERE id1 = @lastid

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

4

2 回答 2

1

您可以使用触发器:

CREATE TRIGGER biA1 BEFORE INSERT ON a1 FOR EACH ROW SET NEW.item = (
  SELECT COALESCE(MAX(item), (NEW.ptype-36)*1000) + 1
  FROM   a1
  WHERE  ptype = NEW.ptype AND plate = 7 AND userid = NEW.userid
)
于 2012-06-05T01:47:28.877 回答
1

首先,你没有问的答案:通过在他们自己的表中创建行来扭转你的想法(使用 AUTO_INCREMENT 作为 eggyal 建议的),然后将数据移动到这个表中。

现在答案是:

您的信息有点不匹配,这可能解释了问题,或者只是一个红鲱鱼。例如,您没有描述“plate”是什么,但您在查询中使用了它。您还使用@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();

然后你可以得到最大的“项目”:

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

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

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

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

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

希望有帮助。

于 2012-06-05T02:32:45.937 回答