समझ सकते हैं इस सवाल से MYSQL join results set wiped results during IN() in where clause?स्प्लिट एक (सरणी, जैसे, अभिव्यक्ति, सूची) में group_concat से ने MySQL स्ट्रिंग है जो में()
तो, सवाल का लघु संस्करण पर इस प्रकार है। आप GROUP_CONCAT द्वारा लौटाई गई स्ट्रिंग को अल्पविराम से अलग अभिव्यक्ति सूची में कैसे बदलते हैं, जिसमें IN() लूप को एकाधिक आइटम्स की सूची के रूप में पेश करेगा?
एनबी। MySQL दस्तावेज़ "(अल्पविराम, पृथक, सूचियां)" को संदर्भित करते हैं, जो 'अभिव्यक्ति सूचियों' के रूप में IN() द्वारा उपयोग किए जाते हैं, और दिलचस्प रूप से IN() पर पृष्ठ MySQL दस्तावेज़ों में केवल एक ही पृष्ठ होते हैं कभी अभिव्यक्ति सूचियों का संदर्भ लें। तो मुझे यकीन नहीं है कि अगर सरणी या अस्थायी सारणी बनाने के उद्देश्य से कार्य किया जाए तो यहां कोई उपयोग किया जाएगा।
प्रश्न के लंबे उदाहरण आधारित संस्करण: एक 2-तालिका DB से इस तरह:
SELECT id, name, GROUP_CONCAT(tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id GROUP BY person.id;
+----+------+----------------------+
| id | name | GROUP_CONCAT(tag_id) |
+----+------+----------------------+
| 1 | Bob | 1,2 |
| 2 | Jill | 2,3 |
+----+------+----------------------+
मैं इस, जो बाद से यह एक स्ट्रिंग का उपयोग करता है के तार्किक समकक्ष के रूप में व्यवहार किया जाता है कैसे बदल सकते हैं (1 = एक्स) और (2 = एक्स) ...
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person LEFT JOIN tag ON person.id = tag.person_id
GROUP BY person.id HAVING ((1 IN (GROUP_CONCAT(tag.tag_id))) AND (2 IN (GROUP_CONCAT(tag.tag_id))));
Empty set (0.01 sec)
... कुछ में जहां group_concat परिणाम एक सूची के रूप में व्यवहार किया जाता है, ताकि बॉब के लिए, यह के बराबर होगा:
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id AND person.id = 1
GROUP BY person.id HAVING ((1 IN (1,2)) AND (2 IN (1,2)));
+------+--------------------------+
| name | GROUP_CONCAT(tag.tag_id) |
+------+--------------------------+
| Bob | 1,2 |
+------+--------------------------+
1 row in set (0.00 sec)
... और जिल के लिए, यह के बराबर होगा:
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id AND person.id = 2
GROUP BY person.id HAVING ((1 IN (2,3)) AND (2 IN (2,3)));
Empty set (0.00 sec)
... इसलिए समग्र परिणाम एक विशेष खोज सभी सूचीबद्ध टैग होने COUNT का उपयोग नहीं करता की आवश्यकता होती है खंड होगा (DISTINCT ...)?
(ध्यान दें: इस तर्क के बिना काम करता है और, स्ट्रिंग के प्रथम वर्ण के लिए आवेदन जैसे
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person LEFT JOIN tag ON person.id = tag.person_id
GROUP BY person.id HAVING ((2 IN (GROUP_CONCAT(tag.tag_id))));
+------+--------------------------+
| name | GROUP_CONCAT(tag.tag_id) |
+------+--------------------------+
| Jill | 2,3 |
+------+--------------------------+
1 row in set (0.00 sec)
यह अच्छा है, लेकिन यह ध्यान देने योग्य बात है कि आप() 'में सभी' FIND_IN_SET() '' group_concat करने की ज़रूरत नहीं है लायक है। आप बस GROUP_CONCAT (टैग.tag_id) AS टैग_लिस्ट' चुन सकते हैं और फिर 'FIND_IN_SET (20, टैग_सूची)' – Treffynnon