Všechny doplňky mohou být v balíčku nebo ne, což z toho činí binární vlastnost.
Způsob, jak si kombinaci představit, je vytvořit slovo s bitem pro každou extra, 1
znamená, že doplněk je v seznamu, 0
znamená, že tomu tak není.
Například Bench + undershelf + overshelf
je 110 (nebo 011, pokud se binární řetězec čte v opačném pořadí)
Generování každé kombinace n bitů dá každou kombinaci n extra, dá také každé číslo od 0
až 2^n - 1
.
Můžeme pracovat zpět odtud:
1. vygenerujte seznam čísel z 0
až 2^n - 1
;
2. převeďte číslo na binární, zobrazí se kombinace extra
3. sladit každý kousek s extra
4. zřetězit názvy doplňků v popisu balíčku.
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
tento dotaz bude fungovat až se šesti doplňky, pak bude potřebovat další tabulku číslic (jedna číslice každé tři doplňky).
Jak to funguje
Poddotaz E
spočítat počet doplňků, to se používá v C
pro omezení prvků generovaných tabulkami číslic u
a t
(jednotka a desítky) na 2^dim.
Číslo je převedeno na binární pomocí BIN(u.N + t.N * 10)
, pak doleva doplněn o '0' k počtu prvků, čímž se vygeneruje kombinovaná bitmapa.
Chcete-li použít vygenerovanou bitmapu, každý doplněk potřebuje falešné ID, které bude odpovídat pozici v něm, to je poddotaz X
je určeno pro.
Dva dílčí dotazy jsou JOIN
ed pomocí n-tého znaku bitmapy:pokud je znak 1, další je ve svazku, LEFT
spojené, aby se produkt neztratil bez doplňků.