2012-06-05 3 views
0

У меня есть простая таблица в MySQL, который имеет различные типы записей, отличить по значениям в столбце ptypeавтоматического приращения, используя «случая» в MySQL

мой стол выглядит как этот

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

было бы добавить 1 к существующему для PTYPE = 43 и USR = 3 id1 ... ptype..usr наибольшего числа ...
пункта 6 ..... 43 ....... 3 ...... 7002

если мы добавили еще одну запись для PTYPE = 44 и USR = 2 id1 ... ptype..usr ... товар
7 ..... 44 ... .... 2 ...... 8002

Я думаю, что я должен сделать это, предварительно вставив новую запись с item пустым, а затем обновив эту запись с информацией, полученной из новой записи (то есть @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 возвращается значение 0 изначально, независимо от того, какой 'PTYPE' новая запись имеет, и увеличивающиеся на 1 для последующих записей .... мне нужна первая запись добавляется в каждом PTYPE быть 5001 6001, 7001 и т.д.

ответ

1

во-первых, answe r, о котором вы не спрашивали: отмените свою идею, создав строки в своих собственных таблицах (с предложением AUTO_INCREMENT как предложено eggyal), а затем переместите данные в эту таблицу.

А теперь ответ:

Ваша информация немного неправильно подобранная, которые могли бы объяснить проблему или просто быть отвлекающим маневром. Например, вы не описываете, что такое «тарелка», но вы используете его в своем запросе. Вы также используете @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); 

вытащил идентификатор, как и вы:

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

Обратите внимание, что это не поточно, так обернуть все это в транзакции/триггера.

Надеюсь, что это поможет.

+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

но я не хочу уникальных значений автоматического прироста, я хочу, чтобы значения автоматически увеличивались на 1, начиная с базы 5000, 6000, 7000, 8000, 9000 или 10000 (в зависимости от 'ptype') и уникальных для каждого 'usr' #. так что 'usr' = 99 может иметь' item' = 7001, и поэтому может 'usr' = 72 – Nat

+0

@NathanielBarre: мое недоразумение - см. мой пересмотренный ответ выше. – eggyal

+0

Как бы этот код знал, какой базовый уровень начать для каждого разного ptype? – Nat