每个附加项都可以包含在捆绑包中,也可以不在捆绑包中,从而成为二进制属性。
可视化组合的一种方法是为每个多余项创建一个单词,
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 ' + ')) , '')) CombinationFROM (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”,从而生成一个组合位图。
要使用生成的位图,每个附加项都需要一个伪造的ID,该ID将与其中的位置匹配,这就是子查询 X
的目的。
这两个子查询
JOIN由位图的第n个char进行编辑:如果char为1,则捆绑包中包含多余的字符,将其合并
LEFT以不松散没有多余的产品。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)