2010-03-25 36 views
5

Tôi muốn liệt kê tất cả người dùng với lớp người dùng corropsonding của họ. Dưới đây là phiên bản đơn giản của bảng của tôimysql 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'); 

Và đây là báo cáo kết quả truy vấn Tôi cố gắng để sử dụng nhưng chỉ trả lại lớp người sử dụng phù hợp đầu tiên và không phải là một danh sách nối như mong đợi.

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; 

Output thực tế

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

Output Wanted

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

Cảm ơn trước

Trả lời

5

Đây không phải là thiết kế tốt nhất, nhưng đây là truy vấn mà bạn muốn:

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

này phá vỡ quy tắc của chuẩn hóa dữ liệu. Không lưu trữ các giá trị nhiều thành nhiều trong danh sách được phân cách bằng dấu phẩy. Thay vào đó, hãy tạo một bảng user_classes khác với các trường user_id và class_id. Bảng này được sử dụng đơn giản như một bảng liên kết giữa hai lớp khác. Sau này, bạn có thể sử dụng GROUP_CONCAT để làm những gì bạn muốn.

+0

+1 cho thiết kế RDBMS thích – WirthLuce

Các vấn đề liên quan