Wszystkie dodatki mogą znajdować się w pakiecie lub nie, co sprawia, że jest to właściwość binarna.
Sposób wizualizacji kombinacji polega na utworzeniu słowa z bitem dla każdego dodatku, 1
oznacza, że dodatek jest na liście, 0
oznacza, że tak nie jest.
Na przykład Bench + undershelf + overshelf
wynosi 110 (lub 011, jeśli ciąg binarny jest odczytywany w odwrotnej kolejności)
Generowanie każdej kombinacji n bitów da każdą kombinację n dodatków, da także każdą liczbę od 0
do 2^n - 1
.
Możemy wrócić stąd:
1. wygeneruj listę numerów od 0
do 2^n - 1
;
2. przekonwertuj liczbę na binarną, aby wyświetlić kombinację dodatków
3. dopasuj każdy bit z dodatkowym
4. połącz nazwy dodatków w opisie pakietu.
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
to zapytanie będzie działać do sześciu dodatków, wtedy będzie potrzebna kolejna tabela cyfr (jedna cyfra na trzy dodatki).
Jak to działa
Podzapytanie E
policz liczbę dodatków, jest to używane w C
aby ograniczyć elementy generowane przez tablice cyfr u
i t
(jednostki i dziesiątki) na 2^wymiar.
Liczba jest konwertowana na binarną przez BIN(u.N + t.N * 10)
, a następnie w lewo dopełnione cyfrą „0” do liczby elementów, tworząc kombinowaną bitmapę.
Aby użyć wygenerowanej mapy bitowej, każdy dodatek potrzebuje fałszywego identyfikatora, który będzie pasował do pozycji w nim, to jest właśnie podzapytanie X
jest przeznaczony.
Dwa podzapytania to JOIN
ed przez n-ty znak mapy bitowej:jeśli znak wynosi 1, dodatek znajduje się w pakiecie, LEFT
połączone, aby nie zgubić produktu bez dodatków.