2010-03-25 13 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'); 

के सरलीकृत संस्करण हैं और इस क्वेरी बयान मैं उपयोग करने के लिए कोशिश कर रहा हूँ लेकिन केवल पहले उपयोगकर्ता मिलान वर्ग लौटा रहा है और नहीं एक concatenated सूची के रूप में आशा व्यक्त की है।

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

यह सबसे अच्छा डिजाइन नहीं है, लेकिन यहां प्रश्न आप चाहते है: उचित आरडीबीएमएस डिजाइन के लिए

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

संबंधित मुद्दे