我想列出所有用户的corropsonding用户类。 以下是我的表格的简化版本
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 |
+---------+---------------------+
提前致谢
答案 0 :(得分:6)
这不是最好的设计,但这是您想要的查询:
SELECT user_id, GROUP_CONCAT(class_name)
FROM users
JOIN classes
ON FIND_IN_SET(class_id, user_class)
GROUP BY
user_id
答案 1 :(得分:3)
这打破了数据库规范化的规则。不要在逗号分隔列表中存储多对多值。而是使用字段user_id和class_id创建另一个表user_classes。此表仅用作其他两个类之间的链接表。在此之后,您可以使用GROUP_CONCAT来执行您想要的操作。