2010-03-25 226 views
5

我想列出所有用户使用它们的corropsonding用户类。 这里是我的表mysql 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'); 

的简化版本,这是查询语句中,我尝试使用,但只返回第一个匹配的用户类,而不是作为一个希望拼接列表。

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; 

实际输出

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

通缉输出

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

在此先感谢

回答

5

这是不是最好的设计,但这里是你想要的查询:正确RDBMS设计

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

这打破了数据库规范化的规则。不要在逗号分隔列表中存储多对多值。相反,使用字段user_id和class_id创建另一个表user_classes。该表格仅用作其他两个类别之间的链接表。在此之后,您可以使用GROUP_CONCAT来做你想做的事。

+0

+1 – WirthLuce 2012-07-05 18:22:30