2009-06-04 14 views
1

Hier ist eine knifflige.MySQL-Gruppierung mit einem Komma getrennten Feld

Ich habe Daten wie folgt:

 
User ID Name  Skill Sets 
1  Jim  Install, Configure 
2  Jack  Install 
3  John  Configure, Setup, Blah 
4  Bill  Setup, Install 

Das ist nicht meine Absicht, und es ist nicht eine Option, um die Art und Weise zu ändern, die Daten formatiert ist. Das Problem ist, dass ich nach den einzigartigen Fähigkeiten gruppieren muss. Offensichtlich eine Gruppe jetzt durch gibt mir:

 
Skill Set    Count 
Install, Configure  1 
Install     1 
Configure, Setup, Blah 1 
Setup, Install   1 

gewünschte Ausgabe ist:

 
Skill Set Count 
Install  3 
Configure 2 
Setup  2 
Blah   1 

Irgendwelche Ideen? Ich könnte mir vorstellen, dass die Fähigkeiten in eine normalisierte Form (wie es sein sollte) unterteilt werden. Aber ich bin auch nicht von der Syntax überzeugt.

+0

Ist die Menge der möglichen Fähigkeiten gut definiert, oder müssen Sie nach "was auch immer in einem Kompetenzfeld angezeigt wird" gehen? – balpha

+0

Die Fähigkeiten sind in einer separaten Tabelle gut definiert. Sie haben sich dafür entschieden, die Zeichenfolge zu verketten, anstatt eine korrekte relationale Tabelle zu verwenden. Die Daten sind natürlich scheiße, weil es in einigen Skillnamen Tippfehler gab, die geändert wurden. Ich kann akzeptieren, "Install" und "Instla" als separate Gruppen zu haben. –

Antwort

7

Sie benötigen ein Rowset mit allen möglichen Werten Ihrer Fähigkeiten.

MySQL fehlt eine Möglichkeit, es zu tun, so müssen Sie es irgendwie generieren.

Wenn Sie eine solche resultset, nur Ausgabe:

SELECT skill, COUNT(*) 
FROM (
     SELECT 'Install' AS skill 
     UNION ALL 
     SELECT 'Configure' AS skill 
     UNION ALL 
     SELECT 'Setup' AS skill 
     UNION ALL 
     SELECT 'Blah' AS skill 
     ) s 
JOIN users u 
ON  find_in_set(s.skill, u.sets) 
GROUP BY 
     s.skill 

Da Sie erwähnt, dass Sie Ihre Fähigkeiten in einer separaten Tabelle haben, diese Tabelle verwenden:

SELECT skill, COUNT(*) 
FROM skills s 
JOIN users u 
ON  find_in_set(s.skill, u.sets) 
GROUP BY 
     s.skill 

Das aber wird nicht immer mit den Tippfehlern übereinstimmen, werden sie einfach übersprungen.

+0

Auf den ersten Blick sieht es so aus, als würde mir die Anzahl der Fähigkeiten, die jeder Benutzer hat, gegenüber der Anzahl der Benutzer, die jede Fähigkeit hat, geben. Dennoch ist das Konzept das gleiche (denke ich). Ich gebe das eine Chance. –

+0

@epalla: Ja, du hast recht, Aktualisierung. – Quassnoi

+1

Funktioniert gut, danke Quassnoi! das "find_in_set" war das fehlende link für mich. –

Verwandte Themen