प्रत्येक अतिरिक्त बंडल में हो सकता है या नहीं, जिससे यह एक द्विआधारी गुण बन जाता है।
संयोजन की कल्पना करने का एक तरीका प्रत्येक अतिरिक्त के लिए एक बिट के साथ एक शब्द बनाना है, 1
इसका मतलब है कि अतिरिक्त सूची में है, 0
इसका मतलब है कि यह नहीं है।
उदाहरण के लिए Bench + undershelf + overshelf
110 है (या 011 यदि बाइनरी स्ट्रिंग को विपरीत क्रम में पढ़ा जाता है)
n बिट के प्रत्येक संयोजन को उत्पन्न करने से n अतिरिक्त का प्रत्येक संयोजन मिलेगा, यह 0
से प्रत्येक संख्या भी देगा से 2^n - 1
. तक .
हम यहां से वापस काम कर सकते हैं:
1. 0
. से नंबरों की सूची बनाएं से 2^n - 1
. तक;
2. अतिरिक्त के संयोजन को सूचीबद्ध करने के लिए संख्या को बाइनरी में बदलें
3. हर बिट को एक अतिरिक्त
4 के साथ मिलाएं। बंडल विवरण में अतिरिक्त के नाम संयोजित करें।
SELECT CONCAT(b.Name
, COALESCE(CONCAT(' + '
, GROUP_CONCAT(x.Name SEPARATOR ' + '))
, '')) Combination
FROM (SELECT p.Name, p.id
, LPAD(BIN(u.N + t.N * 10), e.Dim, '0') bitmap
FROM Products p
CROSS JOIN (SELECT 0 N UNION ALL SELECT 1
UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
UNION ALL SELECT 8 UNION ALL SELECT 9) u
CROSS JOIN (SELECT 0 N UNION ALL SELECT 1
UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
UNION ALL SELECT 8 UNION ALL SELECT 9) t
INNER JOIN (SELECT COUNT(1) Dim
, `Parent ID` pID
FROM Extra) E ON e.pID = p.ID
WHERE u.N + t.N * 10 < Pow(2, e.Dim)
) B
LEFT JOIN (SELECT @rownum := @rownum + 1 ID
, `Parent ID` pID
, Name
FROM Extra
, (Select @rownum := 0) r) X
ON x.pID = b.ID
AND SUBSTRING(b.bitmap, x.ID, 1) = '1'
GROUP BY b.Name, b.bitmap
यह क्वेरी छह अतिरिक्त तक काम करेगी, फिर इसके लिए एक और अंक तालिका की आवश्यकता होगी (प्रत्येक तीन अतिरिक्त में एक अंक)।
यह कैसे काम करता है
सबक्वेरी E
अतिरिक्त की संख्या की गणना करें, इसका उपयोग C
. में किया जाता है अंक तालिका द्वारा उत्पन्न तत्वों को सीमित करने के लिए u
और t
(इकाई और दहाई) से 2^मंद।
संख्या को BIN(u.N + t.N * 10)
. द्वारा बाइनरी में बदल दिया जाता है , फिर तत्वों की संख्या के लिए '0' के साथ गद्देदार छोड़ दिया, एक संयोजन बिटमैप उत्पन्न कर रहा है।
जेनरेट किए गए बिटमैप का उपयोग करने के लिए प्रत्येक अतिरिक्त को एक नकली आईडी की आवश्यकता होती है जो उसमें एक स्थिति से मेल खाती है, यही सबक्वेरी X
है के लिए है।
दो उपश्रेणियाँ हैं JOIN
बिटमैप के nवें चार द्वारा एड:यदि चार 1 है तो अतिरिक्त बंडल में है, LEFT
अतिरिक्त के बिना उत्पाद को नहीं खोलने के लिए शामिल हुए।