mysql GROUP_CONCAT

6
我想列出所有用户及其对应的用户类别。 以下是我表格的简化版本。
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    |
+---------+---------------------+

感谢您的提前帮助。
2个回答

7
这不是最佳设计,但这里有您想要的查询:

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_classes的表,其中包含user_id和class_id字段。该表仅用作其他两个表之间的链接表。完成后,您可以使用GROUP_CONCAT来实现您想要的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接