2016-06-02 14 views
0

Tabelle einer - Arbeitsauftragdurch Komma getrennt

╔══════════╦══════════════╦══════════════╗ 
║ id  ║ wpeople ║ start_date ║ 
╠══════════╬══════════════╬══════════════╣ 
║ 1  ║ 1,2,4  ║ 02.08.2016 ║ 
║ 2  ║ 4,5   ║ 28.09.2016 ║ 
╚══════════╩══════════════╩══════════════╝ 

Tabelle zwei - Mitarbeiter

╔══════════╦═════════════════╗ 
║ id  ║ name   ║ 
╠══════════╬═════════════════╣ 
║ 1  ║ John   ║ 
║ 2  ║ Ben    ║ 
║ 3  ║ Ian    ║ 
║ 4  ║ Hank   ║ 
║ 5  ║ George   ║ 
╚══════════╩═════════════════╝ 

Output Auswahl für die am Projekt

arbeiten müssen
╔══════════╦════════════════╦════════════╗ 
║ 1  ║ John,Ben,Hank ║ 02.08.2016 ║ 
║ 2  ║ Hank,George ║ 28.09.2016 ║ 
╚══════════╩════════════════╩════════════╝ 

Ich habe versucht mit GROUP_CONCAT und FIND_IN_SET

SELECT w.id, 
     GROUP_CONCAT(e.name ORDER BY e.id) workorder 
FROM workorder w 
     INNER JOIN employees e 
      ON FIND_IN_SET(e.id, a.wpeople) > 0 
GROUP BY w.id 

Aber der Ausgang ist es

╔══════════╦════════════════╦════════════╗ 
║ 1  ║ John   ║ 02.08.2016 ║ 
║ 1  ║ Ben   ║ 02.08.2016 ║ 
║ 1  ║ Hank   ║ 02.08.2016 ║ 
║ 2  ║ Hank   ║ 28.09.2016 ║ 
║ 2  ║ George   ║ 28.09.2016 ║ 
╚══════════╩════════════════╩════════════╝ 

ich für diese Suche auf Google und die Lösung ist es GROUP_CONCAT - FIND_IN_SET. Kann sein, dass ich diese Funktion nicht sehr gut verstanden habe.

Vielen Dank für Ihre Zeit! Stefan

+0

Sie haben sowieso keinen 'a'-Alias, also wäre die Abfrage ein flacher Syntaxfehler. 'A.wpeople' existiert nicht. Und warum hast du deine Tische nicht von Anfang an normalisiert? Das Speichern mehrerer Datenwerte in einem zweiten Feld ist fast ein Zeichen für ein schlechtes Design. find_in_set() ist sehr ineffizient, da Indizes nicht verwendet werden können. –

+0

Wie oben erwähnt, müssen Sie diese Daten denormalisieren. Das heißt, die Formatierung der Ausgabe sollte besser der Präsentationsschicht als der Datenschicht überlassen werden. Was verwenden Sie, um die Daten anzuzeigen? Eine Internetseite? Eine App? – mrunion

+0

@ Marc Mein schlecht, ich vergesse ... um es zu ändern, in meinem Code ist es a und b, hier habe ich die Änderung e von Mitarbeitern und b Form Arbeitsauftrag @mrunion Ich benutze diese SQL-Abfrage für eine Anwendung, verwendet, um Arbeitsplätze für Mitarbeiter zu verwalten und am Ende eine E-Mail senden, um sie wissen zu lassen ... – zmeutz

Antwort

0

Für alle, die dies benötigen: habe ich eine neue Tabelle

werkbon_employee
╔══════════╦═══════════════════╦═══════════════╗ 
║ id  ║ workorder_id ║ employee_id ║ 
╠══════════╬═══════════════════╬═══════════════╣ 
║ 1  ║ 1     ║ 1   ║ 
║ 2  ║ 1     ║ 2   ║ 
║ 3  ║ 1     ║ 4   ║ 
║ 4  ║ 2     ║ 4   ║ 
║ 5  ║ 2     ║ 5   ║ 
╚══════════╩═══════════════════╩═══════════════╝ 

I verwendet

SELECT *, 
     GROUP_CONCAT(e.name ORDER BY e.id) ename 
FROM werkbon 
     LEFT JOIN werkbon_employee we ON werkbon.id = we.werkbon_id 
     INNER JOIN employees e ON FIND_IN_SET(e.id, we.employee_id) > 0 
GROUP BY werkbon.id DESC LIMIT 1 

nun das Ergebnis zu wählen, es ist

Werk mensen 
John,Ben,Hank 

Datum 
02.08.2016 

Dank an @MarcB für Hilfe