2017-10-04 2 views
1

Essayer de faire ce qui suit: si la colonne c1 de la ligne courante est égale à c1 de la rangée précédente, mettre la colonne c3 à la colonne c2 de la rangée précédente; sinon, définissez c3 sur NULL (ou ne le définissez pas sur n'importe quoi). Quelqu'un peut-il me dire pourquoi la requête suivante dans c3 étant nulle pour chaque ligne?mysql: mettre la colonne à la valeur de la rangée précédente en fonction de la valeur d'une autre colonne

Les colonnes fictives sont juste là pour pouvoir définir les variables @ c1 et @ c2, qui sont supposées stocker les valeurs c1 et c2 de cette ligne à utiliser pour la ligne suivante. BTW, ai-je tort de supposer que c3 sera mis à jour en premier, c'est-à-dire qu'il obtiendra la valeur précédente de @ c2 (avant que c2 ne soit affecté au c2 actuel)?

UPDATE t SET c3 = IF (c1 = @c1, @c2, NULL), dummy1 = @c1:=c1, dummy2 = @c2:=c2; 

Répondre

2

J'ai essayé ceci et cela semble fonctionner correctement. Mais vous avez besoin d'un ORDER BY si vous devez évaluer les lignes dans un ordre spécifique.

create table t (c1 int, c2 int, c3 int, id int auto_increment primary key); 

insert into t (c1, c2, c3) values 
(1, 2, 3), 
(1, 4, 5), 
(2, 6, 7); 

select * from t; 
+------+------+------+----+ 
| c1 | c2 | c3 | id | 
+------+------+------+----+ 
| 1 | 2 | 3 | 1 | 
| 1 | 4 | 5 | 2 | 
| 2 | 6 | 7 | 3 | 
+------+------+------+----+ 

update t set c3=if([email protected],@c2,NULL), c1 = @c1:=c1, c2 = @c2:=c2 order by id; 
Query OK, 3 rows affected (0.02 sec) 
Rows matched: 3 Changed: 3 Warnings: 0 

select * from t; 
+------+------+------+----+ 
| c1 | c2 | c3 | id | 
+------+------+------+----+ 
| 1 | 2 | NULL | 1 | 
| 1 | 4 | 2 | 2 | 
| 2 | 6 | NULL | 3 | 
+------+------+------+----+ 

Notez que je n'ai pas besoin de colonnes factices. Définissez simplement c1 = c1 et c2 = c2, car ce sont des no-ops.

+0

Oui, j'ai complètement oublié la commande - 'ORDER BY id, c1' travaillé pour moi! Bon point de ne pas avoir besoin des colonnes factices. Merci! – Yury

+0

Juste curieux de savoir pourquoi «ORDER BY id' seul ne le fait pas pour moi - des idées? AFAIK, il n'y a pas de null dans les deux colonnes (déjà fermé, mais vérifiera le matin). – Yury

+0

Puisqu'il existe plusieurs lignes avec chaque valeur d'ID, il existe des liens, et l'ordre des lignes avec le même ID est imprévisible. Désolé j'ai oublié à ce sujet dans ma réponse. –