2016-05-14 6 views
1

ich eine Datenbanktabelle, die eine Liste von Schulen und Namen enthält:Duplikate finden und ihre Werte in SQL fusionieren

 
school name point 
------------------------ 
first  dani good 
first  dani precise 
third  John nice 
first  dani pro 
third  John cute 

Ich möchte für jede Schule/Name Kombination mit nur einem Datensatz bis beenden und verschmelzen die Punktwerte wie folgt aus:

 
school name point 
-------------------------------------- 
first  dani good and precise and pro 
third  John cute and nice 
+1

See GROUP_CONCAT – Strawberry

+0

zu sehen, tun Sie möchten eine aktuelle neue Tabelle, in der die Daten so formatiert sind, oder brauchen Sie sie nur in einer Art Array in Ihrem PHP-Code zu verwenden? – Pevara

+0

Ich möchte Duplikate löschen und bleiben eine Zeile mit diesen Updates – Ricardo

Antwort

3

Sie GROUP_CONCAT so verwenden können, um die Ergebnisse zu erhalten:

SELECT school, name, GROUP_CONCAT(point SEPARATOR ' and ') points 
FROM table 
GROUP BY school, name 

Wenn es in Ordnung ist und Sie Ihre tatsächliche Tabelle durch die Ergebnisse ersetzen möchten, erstellen Sie die gleiche Tabelle mit einem anderen Namen zum Beispiel tmptable.

INSERT INTO tmptable 
SELECT school, name, GROUP_CONCAT(point SEPARATOR ' and ') points 
FROM table 
GROUP BY school, name; 

DROP TABLE table; 
RENAME TABLE tmptable TO table; 

Hier sehen Sie das Ergebnis in einer sqlfiddle

+0

funktioniert nicht, Ihr Code funktioniert, wenn Schulwert und Name Wert gleich sein, aber in meinen Tabellen haben unterschiedliche Werte – Ricardo

+2

Ich glaube nicht ... Haben Sie getestet? – ebahi

+0

ja ... Ich habe es getestet und finde die Werte, die Schule und Name sind gleich, in meinen Tabellen sind diese Werte unterschiedlich – Ricardo

1

hier eine Probe ist, dass wird für Sie arbeitet

und eine neue mit DISTINCT

SELECT 
    school, 
    `name`, 
    GROUP_CONCAT(`point` SEPARATOR ' and ') 
FROM (SELECT DISTINCT school,`name`, `point` FROM groupme) AS result 
GROUP BY school,`NAME`; 

SELECT 
    school, 
    `name`, 
    GROUP_CONCAT(`point` SEPARATOR ' and ') 
FROM groupme 
GROUP BY school,`name`; 

Probe

MariaDB [mysql]> select * from groupme; 
+----+--------+------+---------+ 
| id | school | name | point | 
+----+--------+------+---------+ 
| 1 | first | dani | good | 
| 2 | first | dani | precise | 
| 3 | third | John | nice | 
| 4 | first | dani | pro  | 
| 5 | third | John | cute | 
+----+--------+------+---------+ 
5 rows in set (0.01 sec) 

MariaDB [mysql]> SELECT school, `name` , GROUP_CONCAT(`point` SEPARATOR ' and ') 
    -> FROM groupme 
    -> GROUP BY school,`name`; 
+--------+------+------------------------------------------+ 
| school | name | GROUP_CONCAT(`point` SEPARATOR ' and ') | 
+--------+------+------------------------------------------+ 
| first | dani | good and precise and pro     | 
| third | John | nice and cute       | 
+--------+------+------------------------------------------+ 
2 rows in set (0.00 sec) 

MariaDB [mysql]> 
+0

finden Sie die Zeilen, die Schule und Name sind gleich, in meinen Tabellen sind diese Werte unterschiedlich – Ricardo

+0

ich verstehe nicht, Haben Sie getestet, posten Sie Ihre Tabelle –

+0

ich habe eine weitere SQL mit DISTINCT hinzugefügt, so dass jeder Punkt nur einmal im Ergebnis ist –

1

@ ebahi Antwort verwenden:

Ändern Sie die Abfrage in wie @fuzzytree erwähnt:

SELECT school, name, GROUP_CONCAT(distinct point SEPARATOR ' and ') points 
FROM table 
GROUP BY school, name 

sqlfiddle das Ergebnis

Verwandte Themen