2010-03-25 4 views
5

Je veux lister tous les utilisateurs avec leur classe d'utilisateur corropsonding. Voici des versions simplifiées de mes tablesmysql GROUP_CONCAT

CREATE TABLE users (
    user_id INT NOT NULL AUTO_INCREMENT, 
    user_class VARCHAR(100), 
    PRIMARY KEY (user_id) 
); 
INSERT INTO users VALUES 
    (1, '1'), 
    (2, '2'), 
    (3, '1,2'); 
CREATE TABLE classes (
    class_id INT NOT NULL AUTO_INCREMENT, 
    class_name VARCHAR(100), 
    PRIMARY KEY (class_id) 
); 
INSERT INTO classes VALUES 
    (1, 'Class 1'), 
    (2, 'Class 2'); 

Et ceci est l'instruction de requête que je suis en train d'utiliser, mais est seulement retournais la première classe d'utilisateur correspondant et non une liste concaténée qu'espéré.

SELECT user_id, GROUP_CONCAT(DISTINCT class_name SEPARATOR ",") AS class_name 
FROM users, classes 
WHERE user_class IN (class_id) 
GROUP BY user_id; 

sortie réelle

+---------+------------+ 
| user_id | class_name | 
+---------+------------+ 
|  1 | Class 1 | 
|  2 | Class 2 | 
|  3 | Class 1 | 
+---------+------------+ 

Recherché sortie

+---------+---------------------+ 
| user_id | class_name   | 
+---------+---------------------+ 
|  1 | Class 1    | 
|  2 | Class 2    | 
|  3 | Class 1, Class 2 | 
+---------+---------------------+ 

Merci à l'avance

Répondre

5

Ce n'est pas la meilleure conception, mais voici la requête que vous voulez:

SELECT user_id, GROUP_CONCAT(class_name) 
FROM users 
JOIN classes 
ON  FIND_IN_SET(class_id, user_class) 
GROUP BY 
     user_id 
3

Ce enfreint les règles de normalisation de base de données. Ne stockez pas les valeurs plusieurs-à-plusieurs dans une liste séparée par des virgules. Au lieu de cela, créez une autre table user_classes avec les champs user_id et class_id. Cette table est simplement utilisée comme table de liens entre les deux autres classes. Après cela, vous pouvez utiliser GROUP_CONCAT pour faire ce que vous voulez.

+0

+1 pour la conception de SGBDR appropriée – WirthLuce

Questions connexes