это займет два запроса. первый запрос вам нужно изменить таблицу, чтобы добавить новый столбец ... Я только что сделал эти VARCHAR, как тот, что он выглядит как на моей стороне ...
SETUP:
CREATE TABLE my_table
(c1 VARCHAR(55)
,c2 VARCHAR(55)
,c3 VARCHAR(55)
,c4 VARCHAR(55)
);
INSERT INTO my_table VALUES
('a1' , 'b1' , 'c1', 'val1'),
('a1' , 'b1' , 'c1', 'val2'),
('a1' , 'b1' , 'c1', 'val3'),
('a2' , 'b2' , 'c2', 'val1'),
('a2' , 'b2' , 'c2', 'val2'),
('a3' , 'b3' , 'c3', 'val1'),
('a3' , 'b3' , 'c3', 'val2');
FIRST QUERY:
ALTER TABLE my_table
ADD COLUMN c5 VARCHAR(55);
здесь мы просто добавили новый столбец .. назвал его c5.
ВТОРОЙ ЗАПРОС:
UPDATE my_table mt,
(
SELECT
c4,
c1,
IF(@A = c1, @B := @B + 1, @B := 1) AS new_col,
@A := c1
FROM my_table
CROSS JOIN(SELECT @A := '', @B := 1)t
) temp
SET mt.c5 = new_col
WHERE mt.c4 = temp.c4
AND mt.c1 = temp.c1;
здесь мы делаем некоторые расчеты, чтобы сделать подсчет, который увеличивает для каждого типа и сбрасывается, когда он достигает нового. затем обновить таблицу в том же запросе
ТРЕТИЙ QUERY:
SELECT * FROM my_table;
только способ увидеть изменения, сделанные.
DEMO
ВЫВОД:
+---+---+---+-------+--+
|c1 |c2 |c3 |c4 |c5|
+---+---+---+-------+--+
|a1 |b1 |c1 |val1 |1 |
|a1 |b1 |c1 |val2 |2 |
|a1 |b1 |c1 |val3 |3 |
|a2 |b2 |c2 |val1 |1 |
|a2 |b2 |c2 |val2 |2 |
|a3 |b3 |c3 |val1 |1 |
|a3 |b3 |c3 |val2 |2 |
+---+---+---+-------+--+
БОНУС:
просто для удовольствия вы также можете просто выполнить запрос, если вы не хотите, чтобы сделать новый столбец стол. например:
SELECT c1, c2, c3, c4, new_col as c5
FROM
(
SELECT
*,
IF(@A = c1, @B := @B + 1, @B := 1) AS new_col,
@A := c1
FROM my_table
CROSS JOIN(SELECT @A := '', @B := 1)t
) as _outer_
Вы хотите это только для выбора или хотите для команды вставки? –
@JorgeCampos Мне нужно создать другой столбец и обновить новый столбец. – Boxuan
Я вижу. Тогда фразировка была чем-то заблуждением. Не используйте термин «автоинкремент», который предполагает, что вы хотите, чтобы значение было автоматически генерировано при вставке. – RandomSeed