Всяка екстра може да бъде в пакета или не, което го прави двоично свойство.
Начинът да визуализирате комбинацията е да създадете дума с бит за всяка екстра, 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^dim.
Числото се преобразува в двоично чрез BIN(u.N + t.N * 10)
, след това допълнено вляво с '0' до броя на елементите, генерирайки комбинация от растерно изображение.
За да използвате генерираното растерно изображение, всяка екстра се нуждае от фалшив идентификатор, който да съответства на позиция в него, това е, което подзаявката X
е предназначено за.
Двете подзаявки са JOIN
ed от n-ия знак на растерното изображение:ако знакът е 1, допълнителният е в пакета, LEFT
съединени, за да не загубите продукта без екстри.