Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mySQL>> Normalisierung eines kommagetrennten Felds

Bitte kopieren Sie Ihren Code in den eigentlichen Beitrag und geben Sie den Code an, mit dem Sie versucht haben, das Problem zu lösen.

Die Funktion substring_index gibt einen Teil einer Zeichenfolge mit einem Trennzeichen (hier ein Komma) zurück, und wenn ein negativer Index übergeben wird, beginnt sie mit der Suche nach Übereinstimmungen von der gegenüberliegenden Seite, also -1 greift ein Element aus Listen mit mehreren Elementen (für index>=2).

Gemäß unserer Diskussion habe ich optimiert, wie ich dies getan habe, und ein Beispiel für die Verwendung von Auto-Increment gezeigt. (Dies wird im 'build schema'-Teil von fiddle ausgeführt.)

create table TAGS
(`T_ID` int auto_increment primary key, `T_Name` varchar(18))
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(RES_Tags, ',', 1) as X
    FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 2)
      ,',',-1)
  FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 3)
      ,',',-1)  as X
  FROM RESOURCES
;
insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 4)
      ,',',-1)  as X
  FROM RESOURCES
  ;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 5)
      ,',',-1)  as X
  FROM RESOURCES
;

insert ignore into TAGS (T_Name)
  SELECT 
    SUBSTRING_INDEX(
      SUBSTRING_INDEX(RES_Tags, ',', 6)
      ,',',-1)  as X
  FROM RESOURCES
;

create table New_TAGS like TAGS;
insert into New_TAGS (T_Name)
  select distinct trim(T_Name)
  from TAGS;

drop table TAGS;
rename table NEW_TAGS to TAGS;

Dokumentation der Substring-Funktion Mögliche Duplizierung dieser Frage