Varje extra kan vara i paketet eller inte, vilket gör det till en binär egenskap.
Ett sätt att visualisera kombinationen är att skapa ett ord med en bit för varje extra, 1
betyder att extra finns i listan, 0
menar att det inte är det.
Till exempel Bench + undershelf + overshelf
är 110 (eller 011 om den binära strängen läses i motsatt ordning)
Att generera varje kombination av n bitar kommer att ge varje kombination av n extra, det kommer också att ge varje nummer från 0
till 2^n - 1
.
Vi kan arbeta tillbaka härifrån:
1. generera listan med nummer från 0
till 2^n - 1
;
2. konvertera talet till binärt, för att lista kombinationen av extrafunktioner
3. matcha varje bit med en extra
4. sammanfoga namnen på extramaterialen i paketbeskrivningen.
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
den här frågan kommer att fungera upp till sex extrafunktioner, sedan behöver den ytterligare en siffertabell (en siffra var tredje extra).
Så fungerar det
Underfrågan E
räkna antalet extra, detta används i C
för att begränsa de element som genereras av siffertabellerna u
och t
(enhet och tiotal) till 2^dim.
Numret konverteras till binärt med BIN(u.N + t.N * 10)
, sedan vänster utfylld med '0' till antalet element, vilket genererar en kombinationsbitmapp.
För att använda den genererade bitmappen behöver varje extramaterial ett falskt id som matchar en position i den, det är vad underfrågan X
är avsedd för.
De två underfrågorna är JOIN
ed av det n:te tecknet i bitmappen:om tecknet är 1 finns det extra i paketet, LEFT
sammanfogad för att inte tappa produkten utan extrafunktioner.