जैसा कि ऊपर स्ट्रॉबेरी की टिप्पणी से पता चलता है, ऐसा करने का एक तरीका है, लेकिन यह बहुत बदसूरत है। यह डक्ट टेप का उपयोग करके अपने महंगे किचन रीमॉडेल को खत्म करने जैसा है। आपको उस व्यक्ति के प्रति नाराजगी महसूस करनी चाहिए जिसने इस तरह से डेटाबेस तैयार किया है।
SELECT g.id_group, GROUP_CONCAT(n.Names SEPARATOR ' ') AS Names
FROM groups AS g JOIN names AS n
ON FIND_IN_SET(n.id_names, REPLACE(g.Name, '|', ','))
GROUP BY g.id_group;
आउटपुट, MySQL 5.6 पर परीक्षण किया गया:
+----------+---------------+
| id_group | Names |
+----------+---------------+
| 1 | Joe Mary Bill |
| 2 | Fred Mary |
| 3 | Jack Joe |
+----------+---------------+
इस क्वेरी की जटिलता, और तथ्य यह है कि इसे एक टेबल-स्कैन करने के लिए मजबूर किया जाएगा और इसे अनुकूलित नहीं किया जा सकता है, आपको आईडी की सूची को एक सीमांकित स्ट्रिंग में संग्रहीत करने में क्या गलत है ।
बेहतर उपाय यह है कि एक तीसरी तालिका बनाई जाए, जिसमें आप समूह के प्रत्येक व्यक्तिगत सदस्य को एक पंक्ति में स्वयं ही संग्रहीत करते हैं। यानी प्रति समूह कई पंक्तियाँ।
CREATE TABLE group_name (
id_group INT NOT NULL,
id_name INT NOT NULL,
PRIMARY KEY (id_group, id_name)
);
फिर आप सरल तरीके से क्वेरी कर सकते हैं, और आपके पास क्वेरी को बहुत तेज़ बनाने के लिए इंडेक्स बनाने का अवसर है।
SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
FROM groups
JOIN group_name USING (id_group)
JOIN names USING (id_name)