Mọi phần bổ sung có thể nằm trong gói hoặc không, làm cho nó trở thành thuộc tính nhị phân.
Một cách để hình dung sự kết hợp là tạo một từ có một bit cho mỗi phần bổ sung, 1
nghĩa là phần bổ sung nằm trong danh sách, 0
nghĩa là không phải.
Ví dụ:Bench + undershelf + overshelf
là 110 (hoặc 011 nếu chuỗi nhị phân được đọc theo thứ tự ngược lại)
Việc tạo mọi kết hợp của n bit sẽ cung cấp mọi kết hợp của n phần phụ, nó cũng sẽ cung cấp mọi số từ 0
thành 2^n - 1
.
Chúng tôi có thể làm việc trở lại từ đây:
1. tạo danh sách số từ 0
thành 2^n - 1
;
2. chuyển đổi số sang hệ nhị phân, để liệt kê sự kết hợp của các phần phụ
3. khớp từng bit với một
4 thừa. nối tên của các tính năng bổ sung trong mô tả gói.
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
truy vấn này sẽ hoạt động tối đa sáu phần bổ sung, sau đó nó sẽ cần một bảng chữ số khác (một chữ số cứ sau ba phần bổ sung).
Cách hoạt động
Truy vấn con E
đếm số phần bổ sung, điều này được sử dụng trong C
để giới hạn các phần tử được tạo bởi các bảng chữ số u
và t
(đơn vị và hàng chục) thành 2 ^ dim.
Số được chuyển đổi thành nhị phân bởi BIN(u.N + t.N * 10)
, sau đó được đệm bên trái bằng '0' vào số phần tử, tạo ra một bitmap kết hợp.
Để sử dụng bitmap được tạo, mỗi phần bổ sung cần một id giả sẽ khớp với một vị trí trong đó, đó là truy vấn con X
có nghĩa là cho.
Hai truy vấn con là JOIN
ed bởi char thứ n của bitmap:nếu char là 1 thì phần bổ sung sẽ nằm trong gói, LEFT
tham gia để không làm mất sản phẩm mà không có tính năng bổ sung.