2017-07-20 1 views
3

Ich habe eine Tabelle mit einer Spalte 'search_text' Typ text.Entfernen Sie doppelte Werte in einer Zelle MySQL

In diesem Bereich habe ich Werte:

1. 'MyBook MyBook PDF PDF', 
2. 'Example 1 Example 2 Example 3' 
3. 'John Snow John Snow' 

ich verschiedene sauber diesen Bereichen möchten.

Erwartetes Ergebnis:

1. 'MyBook PDF', 
2. 'Example 1 2 3' 
3. 'John Snow' 

Der Ansatz, den ich mit aufkam geht wie folgt: das Feld für jeden Datensatz gelesen, spaltete es durch Leerzeichen (‘‚), wobei jeder Text in Array setzen, tun array_unique in PHP, dann setzen Sie das Array zurück auf String mit join in PHP.

Die Sache ist, das ist eine PHP-basierte Lösung, ich hätte gerne eine MySQL-Lösung dafür. Ich habe über 180.000 Datensätze, die ich putzen muss, ich weiß nicht, welche Auswirkungen dies auf PHP haben würde. Remove duplicate values in a cell SQL Server

Hilfe sehr geschätzt:

Ich habe eine Lösung für MS SQL gefunden.

SQL meiner Testdaten:

CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) unsigned NOT NULL, 
    `search_text` text COLLATE utf8_unicode_ci NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

INSERT INTO `test` (`id`, `search_text`) VALUES 
(1, 'MyBook MyBook PDF PDF'), 
(2, 'Example 1 Example 2 Example 3'), 
(3, 'John Snow John Snow'), 
(4, 'test test test test formula test test test formula test test test formula test test test formula test test test formula test test test formula '), 
(5, ''); 

ALTER TABLE `test` 
ADD PRIMARY KEY (`id`); 

ALTER TABLE `test` 
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6; 

Antwort

0

ich für die PHP-Lösung ging hier:

$s = 'John Snow John Snow'; 
//remove duplicate values in string 
$tmpArray = explode(" ", $s); 
$tmpArray = array_unique($tmpArray); 
$s = join(" ", $tmpArray); 

die vor INSERT ausgeführt wird, und es tut, was ich wollte.

0

Try this von Graf zu sortieren :)

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(test.search_text, ' ', numbers.n), ' ', - 1) col_name 
FROM (
    SELECT 1 n 

    UNION ALL 

    SELECT 2 

    UNION ALL 

    SELECT 3 

    UNION ALL 

    SELECT 4 
    ) numbers 
INNER JOIN test ON CHAR_LENGTH(test.search_text) - CHAR_LENGTH(REPLACE(test.search_text, ' ', '')) >= numbers.n - 1 
ORDER BY col_name; 
+0

schließen, aber jetzt ziemlich, was ich suche. Dies erzeugt Zeilen mit ALLEN Einträgen in ALLEN Zeilen. – Rumplin

+0

Funktioniert auch nicht, wenn es mehr Werte als 4 gibt (z. B. "Test Test Test Test Formel Test Test Test"). – Rumplin

0

Sie benötigen eine MySQL-Funktion zu schreiben, dies für Sie tun. Ich würde denken, dass eine PHP-Seite in Ordnung sein wird. 180.000 Datensätze sind nicht so viele und es sollte (außer Sie verwenden einen Low-Spec-Server) ausgeführt werden, ohne etwas anderes zu belasten.

Ich schrieb 2 für Sie, dass Sie in der Lage sein könnten, Gebrauch zu machen:

DROP PROCEDURE IF EXISTS explode; 
DELIMITER // 
CREATE PROCEDURE explode(str_string TEXT) 
NOT DETERMINISTIC 
BEGIN 
DROP TABLE IF EXISTS explosion;         
CREATE TABLE explosion (id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, word VARCHAR(100));         
SET @sql := CONCAT('INSERT INTO explosion (word) VALUES (', REPLACE(QUOTE(str_string), " ", '\'), (\''), ')');         
PREPARE myStmt FROM @sql;         
EXECUTE myStmt;         
END // 
DELIMITER ; 

Dieses Verfahren schafft eine „Explosion“ -Funktion für den Einsatz in MySQL. Es verwendet eine temporäre Tabelle und sprengt die Worte, die durch Leerzeichen hinein getrennt

Dann wird diese Funktion der Tabelle in, lesen und sie in einer anderen temporären Tisch mit den entfernt Duplikaten:

DROP PROCEDURE IF EXISTS removeDuplicates; 
DELIMITER // 
CREATE PROCEDURE removeDuplicates(str TEXT) 
BEGIN 
    DECLARE temp_word TEXT; 
    DECLARE last_word TEXT DEFAULT ""; 
    DECLARE result TEXT; 
    DECLARE finished INT DEFAULT false; 
    DECLARE words_cursor CURSOR FOR 
     SELECT word FROM explosion; 
    DECLARE CONTINUE handler FOR NOT found 
     SET finished = true; 

    CALL explode(str); 
    DROP TABLE IF EXISTS temp_words; 
    CREATE TABLE temp_words (id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, t VARCHAR(100)); 

    OPEN words_cursor; 
    loop_words: LOOP 

     FETCH words_cursor INTO temp_word; 

     IF finished THEN 
      LEAVE loop_words; 
     END IF; 

     IF last_word = "" THEN 
      INSERT INTO temp_words (t) VALUES (temp_word); 
      SET last_word = temp_word; 
      ITERATE loop_words; 
     END IF; 

     IF last_word = temp_word THEN 
      SET last_word = temp_word; 
      ITERATE loop_words; 
     END IF; 

     INSERT INTO temp_words (t) VALUES (temp_word); 

    END LOOP loop_words; 
    CLOSE words_cursor; 

END // 

DELIMITER ; 

So alles, was Sie Sie müssen herausfinden, wie Sie die Datensätze in temp_words in Ihre aktuelle Datenbanktabelle bekommen.

Verwandte Themen