2010-03-25 225 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