0

mysql に、列の値によって区別されるさまざまな種類のレコードを持つ単純なテーブルがありますptype

私のテーブルはこんな感じ

id1...ptype..usr...item
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......の既存の最大数に 1 を追加します。 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);

UPDATE a1 SET item= @item WHERE id1 = @lastid

現状では、@item は、新しいレコードの 'ptype' に関係なく、最初は 0 の値を返し、後続のエントリに対して 1 ずつ増加します.... 各 ptype に追加される最初のレコードを 5001 6001, 7001 にする必要があります。など

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

まず、あなたが尋ねなかった答え:独自のテーブルに行を作成して(eggyalが提案したように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;

最初のケースを処理するには、デフォルトが必要でした。ptypeを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 に答える