User variable setzen und an anderer Stelle benutzen

User variable setzen und an anderer Stelle benutzen

am 07.04.2008 15:24:13 von Frank Arthur

Ich muss mit meinem Query eine user variable setzen und an einer anderen
Stell benutzen. Für einen Insert zähle ich die user variable für die id
hoch und will sie aber auch zum Konstruieren von Daten in einer anderen
Spalte benutzen.

Beispiel: Ich Setze "B" für eine Spalte einer neuen Zeile für die
Tabelle. die user variable und die id soll für die neue Zeile 2 sein.
Dann muss ich die Spalte id mit 2 setzen aber auch eine andere Spalte mit
"B02".

Ich weiß in der MySQL Dokumentation steht:
The general rule is never to assign a value to a user variable in one
part of a statement and use the same variable in some other part of the
same statement. You might get the results you expect, but this is not
guaranteed.
Aber was Heißt "some other part". Es heißt wohl: Irgendwo anders. Hat
jemand eine Idee, wie ich das Problem umgehen kann?

CREATE TABLE `t3` (
`id` INT NOT NULL,
`payload` VARCHAR(3) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `t3`
(`id`,`payload`)
VALUES (1,'A01')
, (2,'B02')
, (3,'C03')
, (4,'D04');

+----+---------+
| id | payload |
+----+---------+
| 1 | A01 |
| 2 | B02 |
| 3 | C03 |
| 4 | D04 |
+----+---------+

CREATE TABLE `t4` (
`chr` VARCHAR(1) NOT NULL ,
PRIMARY KEY (`chr`)
);
INSERT INTO `t4`
(`chr`)
VALUES ('C')
, ('D')
, ('E')
, ('F');

+-----+
| chr |
+-----+
| C |
| D |
| E |
| F |
+-----+

SELECT @id:=MAX(`id`)
FROM `t3`;
SELECT @id:=(@id + 1)
, CONCAT(`chr`, LPAD(@id, 2, "0")) AS `payload`
FROM `t4`
LEFT JOIN `t3`
ON `t4`.`chr` = LEFT(`t3`.`payload`, 1)
WHERE `t3`.`id` IS NULL;

+----------------+---------+
| @id:=(@id + 1) | payload |
+----------------+---------+
| 5 | E05 |
| 6 | F06 |
+----------------+---------+
(Hier geht es, aber ich will ja auch einen INSERT machen:-(

SELECT @id:=MAX(`id`)
FROM `t3`;
INSERT INTO `t3`
(`id`, `payload`)
SELECT @id:=(@id + 1)
, CONCAT(`chr`, LPAD(@id, 2, "0")) AS `payload`
FROM `t4`
LEFT JOIN `t3`
ON `t4`.`chr` = LEFT(`t3`.`payload`, 1)
WHERE `t3`.`id` IS NULL;

+----+---------+
| id | payload |
+----+---------+
| 1 | A01 |
| 2 | B02 |
| 3 | C03 |
| 4 | D04 |
| 5 | E04 |
| 6 | F04 |
+----+---------+

Gewünscht ist natürlich:
| 5 | E05 |
| 6 | F06 |