2016-08-29 18 views
3

ich eine Tabelle, die wie folgtDuplikate entfernen pro Zeile MySQL

| Domain | Owner | Nameservers   | 
__________________________________________ 
| Test1 | Person1 | Serv1, Serv2, Serv3 | 
| Test2 | Person2 | Serv1    | 
| Test3 | Person3 | Serv1, Serv2  | 

Mein Plan aussieht, ist die Name-Server in eigenen Spalten aufgeteilt. (Ich brauche diese Struktur für die weitere Einfuhr an Drittes System) ..

| Domain | Owner | Nameserver1 | Nameserver2 | Namerserver3 | 
_______________________________________________________________ 
| Test1 | Person1 | Serv1  | Serv2  | Serv 3  | 
| Test2 | Person2 | Serv1  |    |    | 
| Test3 | Person3 | Serv1  | Serv2  |    | 

Die leeren Räume in der Tabelle könnte eine leere Zeichenfolge oder NULL sein.

Ich habe die folgende Abfrage versucht:

CREATE TABLE temp_import_table AS 
    SELECT domain, 
     owner, 
     SUBSTRING_INDEX(`nameservers` , ',', 1) AS nameserver1, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(`nameservers` , ',', 2),',',-1) AS nameserver2, 
     SUBSTRING_INDEX(`nameservers` , ',', -1) AS nameserver3 

Aber irgendwie bekomme ich folgendes Ergebnis:

| Domain | Owner | Nameserver1 | Nameserver2 | Namerserver3 | 
_______________________________________________________________ 
| Test1 | Person1 | Serv1  | Serv2  | Serv3  | 
| Test2 | Person2 | Serv1  | Serv1  | Serv1  | 
| Test3 | Person3 | Serv1  | Serv2  | Serv2  | 

Wie Sie den Nameserver sehen wird mit dem „früheren“ Name-Server bevölkert sogar wenn es im csv-Feld leer ist. Kann jemand mir helfen, die doppelten Werte pro Reihe loszuwerden/zu leeren?

+4

Nein, nein, nein, nein. Verwenden Sie eine separate Tabelle, um die Beziehung zwischen Domänen- und Nameservern zu speichern. –

+0

Exploding CSV in Abfrage mit MySQL ist hässlich und komplex. Sie sollten diese CSV loswerden und stattdessen einen einzigen Namen Nameserver und die andere Seite dieser Beziehung aufnehmen. –

+0

Ich weiß, dass die Struktur schrecklich ist und total gegen die Regeln, aber ich kann nichts aufgrund des Drittanbieter-Systems tun :((Es ist ein Wordpress-Plugin genannt formidable). – malen

Antwort

0

Eine bessere Lösung wäre dieses Plugin zu verlassen, aber nur zum Spaß ...

SELECT * FROM my_table; 
+--------+---------+--------------+ 
| Domain | Owner | Nameservers | 
+--------+---------+--------------+ 
| Test2 | Person2 | Serv1  | 
| Test3 | Person3 | Serv1, Serv2 | 
+--------+---------+--------------+ 

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT DISTINCT domain 
       , owner 
       , TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(nameservers,',',i+1),',',-1)) x 
      FROM my_table 
       , ints; 

+--------+---------+-------+ 
| domain | owner | x  | 
+--------+---------+-------+ 
| Test2 | Person2 | Serv1 | 
| Test3 | Person3 | Serv1 | 
| Test3 | Person3 | Serv2 | 
+--------+---------+-------+ 
0

Sie zählen, wie viele ‚‘ in nameservers, dann verwenden, wenn es zu trennen.

SELECT domain, 
     owner, 
     SUBSTRING_INDEX(`nameservers` , ',', 1) AS nameserver1, 
     IF(
      LENGTH(`nameservers`)-LENGTH(REPLACE(`nameservers`,',',''))>0, 
      SUBSTRING_INDEX(SUBSTRING_INDEX(`nameservers` , ',', 2),',',-1), 
      '' 
    )AS nameserver2, 
     IF(
      LENGTH(`nameservers`)-LENGTH(REPLACE(`nameservers`,',',''))>1, 
      SUBSTRING_INDEX(`nameservers` , ',', -1), 
      '' 
    ) AS nameserver3