すべてのエクストラはバンドルに含まれる場合と含まれない場合があり、バイナリプロパティになります。
組み合わせを視覚化する方法は、エクストラごとにビットを含む単語を作成することです。1
エクストラがリストにあることを意味します、0
そうではないことを意味します。
たとえば、Bench + undershelf + overshelf
は110(または、バイナリ文字列が逆の順序で読み取られる場合は011)
nビットのすべての組み合わせを生成すると、n個のエクストラのすべての組み合わせが得られ、0
からのすべての数値も得られます。 2^n - 1
へ 。
ここから戻ることができます:
1。 0
から番号のリストを生成します 2^n - 1
へ;
2。数値を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
このクエリは最大6つのエクストラで機能し、その後、別の数字テーブルが必要になります(3つのエクストラごとに1つの数字)。
仕組み
サブクエリE
エクストラの数を数えます。これはC
で使用されます 数字テーブルu
によって生成される要素を制限します およびt
(単位と数十)から2^dim。
数値はBIN(u.N + t.N * 10)
によってバイナリに変換されます 、次に要素数に「0」を付けたままにして、組み合わせビットマップを生成します。
生成されたビットマップを使用するには、各エクストラにその中の位置と一致する偽のIDが必要です。これが、サブクエリ X
です。 のためのものです。
2つのサブクエリはJOIN
です。 ビットマップのn番目の文字で編集:文字が1の場合、余分な文字はバンドルに含まれ、LEFT
余分なものなしで製品を失わないように参加しました。