Hvert ekstranummer kan være i bundtet eller ej, hvilket gør det til en binær egenskab.
En måde at visualisere kombinationen på er at skabe et ord med en bit for hver ekstra, 1
betyder, at det ekstra er på listen, 0
mener, at det ikke er det.
For eksempel Bench + undershelf + overshelf
er 110 (eller 011, hvis den binære streng læses i den modsatte rækkefølge)
Generering af hver kombination af n bit vil give hver kombination af n ekstra, det vil også give hvert tal fra 0
til 2^n - 1
.
Vi kan arbejde tilbage herfra:
1. generer listen over numre fra 0
til 2^n - 1
;
2. konverter tallet til binært for at vise kombinationen af ekstrafunktioner
3. match hver bit med en ekstra
4. sammenkæde navnene på ekstramateriale i bundtbeskrivelsen.
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
denne forespørgsel vil fungere op til seks ekstraelementer, så skal den bruge endnu en ciffertabel (et ciffer hver tredje ekstra).
Sådan virker det
Underforespørgslen E
tæl antallet af ekstramateriale, dette bruges i C
for at begrænse de elementer, der genereres af ciffertabellerne u
og t
(enhed og tiere) til 2^dim.
Tallet konverteres til binært med BIN(u.N + t.N * 10)
, derefter venstre polstret med '0' til antallet af elementer, hvilket genererer en kombinationsbitmap.
For at bruge det genererede bitmap skal hvert ekstramateriale have et falsk id, der matcher en position i det, det er hvad underforespørgslen X
er beregnet til.
De to underforespørgsler er JOIN
redigeret af det n'te tegn i bitmap:hvis char er 1 er det ekstra i bundtet, LEFT
sammenføjet for ikke at miste produktet uden ekstraudstyr.