2013-06-04 13 views
6

Ich habe zwei Tabellenmysql verbinden zwei Tabelle mit Komma getrennt ids

Tabelle 1

ID  NAME 
1  Person1 
2  Person2 
3  Person3 

Tabelle 2

ID  GROUP_ID 
1  1 
2  2,3 

Die IDs in allen Spalten oben beziehen sich auf die gleiche ID (Beispiel - eine Abteilung)

Meine Erwarteter Ausgang (durch beide Tabellen verknüpft)

GROUP_ID  NAME 
1   Person1 
2,3   Person2,Person3 

Gibt es eine Abfrage, mit denen ich das erreichen kann. Deine Hilfe wird hoch geschätzt. Vielen Dank.

+0

möglich duplizieren von [Kann ich mehrere MySQL-Zeilen in ein Feld verketten?] (Http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field) – Thomas

Antwort

6

Sie FIND_IN_SET() und GROUP_CONCAT() dazu verwenden können,

SELECT b.Group_ID, GROUP_CONCAT(a.name) name 
FROM Table2 b 
     INNER JOIN Table1 a 
      ON FIND_IN_SET(a.ID, b.Group_ID) > 0 
GROUP BY b.Group_ID 

OUTPUT

╔══════════╦═════════════════╗ 
║ GROUP_ID ║  NAME  ║ 
╠══════════╬═════════════════╣ 
║ 1  ║ Person1   ║ 
║ 2,3  ║ Person2,Person3 ║ 
╚══════════╩═════════════════╝ 

Als Nebenbei bemerkt, diese Abfrage möglicherweise nicht effizient wie erwartet. Bitte normalisieren Sie Ihre Tabelle ordnungsgemäß, indem Sie keine durch ein Komma getrennten Werte speichern.

UPDATE

GROUP_ID ist ziemlich verwirrend. Ist es nicht PersonIDList? Wie auch immer, hier ist mein vorgeschlagene Schema-Design:

PERSON Tabelle

  • PersonID (PK)
  • Person
  • andere Spalten ..

GROUP Tabelle

  • GroupID (PK)
  • Groupname
  • anderen Spalten ..

PERSON_GROUP Tabelle

  • PersonID (FK) (zugleich PK mit Spalte GroupID)
  • GroupID (FK)
+1

Das ist großartig, obwohl es wichtig ist, die Leistung zu beobachten. +1 – KaeL

+0

+1 und OP sollte die Datenstruktur wenn möglich reparieren. – Fallexe

+1

Danke für die Antwort und die Vorschläge. Der vorherige Entwickler, der an dieser kleinen Software gearbeitet hat, hat die Tabellenstrukturen durcheinander gebracht. Aber ich würde sicherlich darüber nachdenken, die Tische zu normalisieren. Danke noch einmal. – user2442377

1

Ich mag die FIND_IN_SET Option, da Sie verwenden MySQL, aber hier ist eine alternative Lösung, die auch mit LIKE in der JOIN funktioniert :

select t2.group_id, group_concat(t1.name order by t1.name separator ',') name 
from t1 inner join t2 
    on concat(',',t2.group_id,',') like concat('%,',t1.id,',%') 
group by t2.group_id; 

SQL Fiddle Demo

Ich würde Sie Ihre Daten in der Normalisierung aussehen vorschlagen - eine durch Kommata getrennte Liste in einer relationalen Datenbank gespeichert ist in der Regel eine schlechte Idee.

+0

Danke für die Alternative. – user2442377