L'éditeur ci-dessous vous proposera un article sur les techniques de changement de colonne mysql (partage). L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur pour y jeter un œil
Avant-propos :
Pour des raisons historiques ou de performances, de nombreuses tables métiers utilisent la violation Un paradigme modèle de conception. Autrement dit, plusieurs valeurs d'attribut sont stockées dans la même colonne (voir le tableau ci-dessous pour la structure spécifique).
Dans ce mode, les applications doivent souvent diviser la colonne en fonction des délimiteurs et obtenir le résultat de la conversion de la colonne.
Données du tableau :
ID | Value |
1 | tiny,small,big |
2 | small,medium |
3 | tiny,big |
Résultats attendus :
ID | Valeur |
1 | minuscule |
1 | petit |
1 | grand |
2 | petit |
2 | moyen |
3 | minuscule |
3 | grand |
Texte :
#需要处理的表 create table tbl_name (ID int ,mSize varchar(100)); insert into tbl_name values (1,'tiny,small,big'); insert into tbl_name values (2,'small,medium'); insert into tbl_name values (3,'tiny,big'); #用于循环的自增表 create table incre_table (AutoIncreID int); insert into incre_table values (1); insert into incre_table values (2); insert into incre_table values (3);
select a.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1) from tbl_name a join incre_table b on b.AutoIncreID <= (length(a.mSize) - length(replace(a.mSize,',',''))+1) order by a.ID;
Analyse du principe :
Le principe le plus fondamental de cette jointure est le produit cartésien. C'est ainsi que la boucle est implémentée.
Ce qui suit est l'analyse spécifique du problème :
length(a.Size) - length(replace(a.mSize,',' ,' '))+1 signifie, après fractionnement par virgules, modifier le nombre de valeurs dans la colonne, ci-après dénommé n
Le pseudo code du processus de jointure :
Boucle basée sur l'ID
{ 判断:i 是否 <= n {
Obtenir les données les plus proches de la i-ème virgule, c'est-à-dire substring_index(substring_index(a.mSize,',' ,b.ID),',',- 1)
i = i +1 } ID = ID +1 }
Résumé :
L'inconvénient de cette méthode est que nous besoin d'un tableau séparé avec des séries continues (ici incre_table). Et la valeur maximale de la séquence continue doit être supérieure au nombre de valeurs qui correspondent à la division.
Par exemple, s'il y a une ligne de mSize avec 100 valeurs séparées par des virgules, alors notre incre_table doit avoir au moins 100 lignes consécutives.
Bien sûr, il existe également des listes de numéros consécutifs prêtes à l'emploi disponibles dans MySQL. Par exemple, mysql.help_topic: help_topic_id a un total de 504 valeurs, qui peuvent généralement répondre à la plupart des besoins.
se réécrit ainsi :
select a.ID,substring_index(substring_index(a.mSize,',',b.help_topic_id+1),',',-1) from tbl_name a join mysql.help_topic b on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1) order by a.ID;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!