Je souhaite mettre à jour une colonne en comparant chaque ligne à toutes les autres lignes du tableau, mais je n'arrive pas à distinguer les noms des colonnes de la ligne en cours de mise à jour par.mySql - mise à jour en comparant des lignes dans la même table
Voici un exemple simplifié ...
personnes:
+--------+-----+----------------+
| name | age | nameClosestAge |
+--------+-----+----------------+
| alice | 20 | |
| bob | 30 | |
| clive | 22 | |
| duncan | 24 | |
+--------+-----+----------------+
Pour remplir la colonne « nameClosestAge » avec le nom de la personne qui est le plus proche en âge de chaque personne, vous pouvez le faire ...
create temporary table peopleTemp like people;
insert into peopleTemp select * from people;
update people set nameClosestAge =
(select name from peopleTemp where people.name != peopleTemp.name
order by abs(people.age - peopleTemp.age) asc limit 1);
qui produit cette ....
+--------+-----+----------------+
| name | age | nameClosestAge |
+--------+-----+----------------+
| alice | 20 | clive |
| bob | 30 | duncan |
| clive | 22 | alice |
| duncan | 25 | clive |
+--------+-----+----------------+
Certes, il y a une façon de le faire sans créer une table en double. Je cherche la méthode la plus efficace ici car j'ai une très grande table et sa mise à jour est trop longue. J'utilise mySql avec PHP.
Il est vraiment peu logique de _store_ nameClosestAge (à moins que ce soit pour la mise en cache) car cela crée de la redondance ... – Jasper
Jasper. Ceci est un exemple simplifié. Le calcul pour le champ mis à jour est plus complexe pour le vrai problème. – spiderplant0
... et les requêtes ultérieures nécessitent que je recherche dans le champ mis à jour. – spiderplant0