2012-06-05 517 views
0

使用「案例」我有一個簡單的表中有不同類型的記錄mysql的,由值列ptype自動遞增在MySQL

我的表看起來像這樣

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 ......?

這將增加1到現有用於p-型= 43和USR = 3 ID1 ... ptype..usr最高號碼...項
6 ..... ....... 43 3 ...... 7002

,如果我們增加了P型= 44和USR = 2 ID1 ... ptype..usr再創歷史新高......項目
7 ..... 44 ... .... 2 ...... 8002

我想我應該這樣做,通過最初插入新記錄與item空白,然後更新該記錄從新記錄(即@lastid)派生的信息使用CASE WHEN THEN方法,但它不起作用。

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); 

UPDATE A1 SET item = @item WHERE ID1 = @lastid

原樣,@item最初返回的0值,不管是什麼 'p型' 的新記錄,並通過增加1對於後續條目....我需要在每個P型添加的第一個記錄是5001 6001,7001,等

回答

1

首先,answe r你沒有問:你可以通過在自己的表中創建行來反轉你的想法(建議使用AUTO_INCREMENT),然後將數據移動到這個表中。

而現在的答案:

你的信息是有點不匹配,這或許可以解釋的問題,或者僅僅是一個紅色的鯡魚。例如,你不會描述什麼「盤子」,而是在你的查詢中使用它。您還可以使用@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; 

要處理的初始情況下,你想要一個默認值。既然你是按1000分離ptypes,您可以使用:

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

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

請注意,這不是線程安全的,所以把它包裝都在一個交易/觸發。

希望有所幫助。

+0

非常甜蜜的答案,我把它包裝在一個交易中,它的運作非常好。 eggyal的似乎也是正確的,但我不認爲我可以使用觸發器,因爲我有其他插入語句插入到同一個表中。謝謝!! – Nat

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 
) 
+0

但我不想要唯一的自動增量值,我想從5000,6000,7000,8000,9000或10000(取決於'ptype')的底部開始自動遞增1並且唯一到每個'usr'#。所以,'usr' = 99可以有'item' = 7001,'usr' = 72 – Nat

+0

@NathanielBarre:我的誤解 - 請參閱我上面修改的答案。 – eggyal

+0

這段代碼如何知道每個不同ptype的起始位置? – Nat