sql >> Database teknologi >  >> RDS >> Mysql

Omstrukturering af en dårlig database med PHP-løkker eller MySQL

Ingen PHP er nødvendig. Du kan kun gøre det med ren MySQL-kode.

Opret tabel/indsæt tabel

CREATE TABLE HugeTable
    (`Column1` VARCHAR(11), `Column2` VARCHAR(11), `Column3` VARCHAR(11))
;

INSERT INTO HugeTable
    (`Column1`, `Column2`, `Column3`)
VALUES
    ('Data1;Data2', 'Data3;Data4', 'Data5;Data6')
; 

CREATE TABLE NewTable
   (`Column1` VARCHAR(11), `Column2` VARCHAR(11), `Column3` VARCHAR(11))
;
 

Først skal vi bruge MySQL til at generere tal. Denne MySQL-kode genererer 1 til 100. Så den endelige forespørgsel vil understøtte op til 100 adskilte værdier.

Forespørgsel

SELECT 
 @row := @row + 1 AS ROW
FROM (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
  SELECT @row := 0 
) init_user_params 
 

Resultat

row -------- 1 2 3 4 5 6 7 8 9 10 ... ... 90 91 92 93 94 95 96 97 98 99 100

Nu kan vi se på en metode til at adskille på; afgrænser. Vi kan bruge indlejrede SUBSTRING_INDEX-funktioner til det

Forespørgsel

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Data1;Data2', ';', 1), ';', -1) AS DATA
 

Resultat

data    
--------
Data1   
 

Du kan kun se det første ord, der returneres, hvis vi vil have det andet ord, vi kan bruge

Forespørgsel

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Data1;Data2', ';', 2), ';', -1) AS DATA
 

Resultat

data    
--------
Data2  
 

Nu kombinerer vi talgeneratoren og SUBSTRING_INDEX for at generere dataene

Forespørgsel

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(Column1, ';', rows.row), ';', -1) Column1 , SUBSTRING_INDEX(SUBSTRING_INDEX(Column2, ';', rows.row), ';', -1) Column2 , SUBSTRING_INDEX(SUBSTRING_INDEX(Column3, ';', rows.row), ';', -1) Column3 FROM ( SELECT @row := @row + 1 AS ROW FROM ( SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 ) row1 CROSS JOIN ( SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 ) row2 CROSS JOIN ( SELECT @row := 0 ) init_user_params ) ROWS CROSS JOIN HugeTable

Resultat

Column1  Column2  Column3  
-------  -------  ---------
Data1    Data3    Data5    
Data2    Data4    Data6    
 

Forespørg efter ny tabel

INSERT INTO NewTable SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(Column1, ';', rows.row), ';', -1) Column1 , SUBSTRING_INDEX(SUBSTRING_INDEX(Column2, ';', rows.row), ';', -1) Column2 , SUBSTRING_INDEX(SUBSTRING_INDEX(Column3, ';', rows.row), ';', -1) Column3 FROM ( SELECT @row := @row + 1 AS ROW FROM ( SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 ) row1 CROSS JOIN ( SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 ) row2 CROSS JOIN ( SELECT @row := 0 ) init_user_params ) ROWS CROSS JOIN HugeTable

Forespørgsel

SELECT * FROM NewTable
 

Resultat

Column1  Column2  Column3  
-------  -------  ---------
Data1    Data3    Data5    
Data2    Data4    Data6    
 



  1. trække 1 fra tallet i en række SQL Query

  2. Sådan sammenlignes to rækker fra samme tabel

  3. hvorfor PG::UniqueViolation:FEJL:duplikeret nøgleværdi overtræder unik begrænsning?

  4. MySQL DROP VIEW