2010-03-25 32 views
5

Quiero enumerar todos los usuarios con su clase de usuario corropsonding. Éstos son versiones simplificadas de mis tablasmysql 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'); 

Y esta es la instrucción de consulta que estoy tratando de usar pero sólo regresa a la primera clase de usuario coincidente y no una lista concatenada como se esperaba.

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; 

Salida Real

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

salida deseada

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

Gracias de antemano

Respuesta

5

Este no es el mejor diseño, pero aquí está la consulta que desea:

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

Esto rompe las reglas de normalización de bases de datos. No almacene valores de muchos a muchos en una lista separada por comas. En su lugar, haga otra tabla user_classes con los campos user_id y class_id. Esta tabla simplemente se usa como una tabla de enlace entre las otras dos clases. Después de esto, puede usar GROUP_CONCAT para hacer lo que quiera.

+0

+1 para el diseño adecuado de RDBMS – WirthLuce