MySQL नहीं जानता कि PHP क्रमांकन क्या है। आप निम्न प्रारूप में श्रेणियों की आईडी को एक स्ट्रिंग के रूप में संग्रहीत कर सकते हैं:
2,4,5,10,...
फिर, SUBSTRING_INDEX() के संयोजन का उपयोग करें
और FIND_IN_SET() MySQL categories.id
के अस्तित्व की जांच करने के लिए कार्य करता है ecommerce_products.catid
. में :
SUBSTRING_INDEX(
SUBSTRING_INDEX(ecommerce_products.catid,
',',
FIND_IN_SET(categories.id, ecommerce_products.catid)
), ',', -1)
प्रत्येक उत्पाद रिकॉर्ड के लिए श्रेणियों के शीर्षक का चयन करने के लिए, हमें शीर्षकों को GROUP_CONCAT()
फ़ंक्शन, तो अंतिम क्वेरी कुछ इस तरह होगी:
SELECT p.id,
p.catid
GROUP_CONCAT(cat.title ORDER BY cat.id SEPARATOR '|') as 'categories',
p.manid,
p.name
FROM ecommerce_products AS p
LEFT JOIN categories AS cat
ON cat.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.catid, ',', FIND_IN_SET(cat.id, p.catid)), ',', -1)
-- more query...
GROUP BY p.id; -- Group the result to concatenate the categories titles
इस दृष्टिकोण में, आपको $this->db->query();
क्वेरी को मैन्युअल रूप से चलाने की विधि।
नोट:
एक विकल्प के रूप में, आप ON
के लिए निम्न का उपयोग कर सकते हैं कथन:
LEFT JOIN categories AS cat
ON p.catid REGEXP CONCAT('[,]{0,1}', cat.id, '[,]{0,1}')
टेस्ट-केस
यहाँ SQLFiddle पर मेरा परीक्षण-मामला है। :
SELECT p.id,
p.name,
GROUP_CONCAT(c.title ORDER BY c.id SEPARATOR '|') as 'categories'
FROM products as p
JOIN categories as c
ON c.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.cat_id, ',', FIND_IN_SET(c.id, p.cat_id)) , ',', -1)
GROUP BY p.id;
परिणाम:
ID NAME CATEGORIES
-- --------- -----------
1 Product 1 Cat 1|Cat 3
2 Product 2 Cat 2|Cat 4
3 Product 3 Cat 1|Cat 4
4 Product 4 Cat 2|Cat 3