我有两张桌子。一个拥有产品,另一个拥有捆绑产品。我需要弄清楚允许我找到所有可以出售附加产品的组合的SQL。
Products
Name ID
Bench 1
Extra
Name ID Parent ID QTY
undershelf 1 1 1
overshelf 2 1 1
wheels 3 1 1
我需要一个输出表,该表显示了我可以销售产品的所有组合:
Bench
Bench + undershelf
Bench + undershelf + overshelf
Bench + overshelf
Bench + wheels
bench + wheels + overshelf and so one.
每个附加项都可以包含在捆绑包中,也可以不在捆绑包中,从而成为二进制属性。
可视化组合的一种方法是为每个多余项创建一个单词,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”,从而生成一个组合位图。
要使用生成的位图,每个附加项都需要一个伪造的ID,该ID将与其中的位置匹配,这就是子查询 X
的目的。
这两个子查询JOIN
由位图的第n个char进行编辑:如果char为1,则捆绑包中包含多余的字符,将其合并LEFT
以不松散没有多余的产品。
问题内容: 我有一个数字列表:(这是现有记录的ID) 我有一个带有列和的mysql表,其中是整数主键。我想从该表中选择的记录,但在一个特定的顺序,例如,,,,,。 是否可以在MyISAM的查询中执行此操作,而无需任何后处理? 最简单的方法是什么? 问题答案: 由于,一个简单就足够了。 但是,如果您要这样订购:,则可以使用function : 如果查询匹配的行多于您列出的行 返回时,行不匹配任何您列
问题内容: 我有一个像下面的表格 我需要先获得特色产品,然后再选择优先级为p1,p2和p3的产品 我写了一个查询,在下面是行不通的。 你能在那发现错误吗 问题答案: 试试这个 如果您在mysql枚举上使用ORDER BY,则不会按字母顺序对其进行排序,而是会按其在枚举中的位置对其进行排序。 如果要按照描述的字母顺序排序,请将枚举名称转换为这样的字符串
问题内容: 在MySQL中是否可以对2行的计算进行排序?例如,我有2行,并且我正在尝试执行以下操作: 这不会引发错误,但是也不会根据该计算结果进行排序。有没有办法做到这一点,还是我必须将lp / ap存储在数据库中? 问题答案: 是的,这是可行的,而且确实可行。查看以下测试: 将返回相同的结果。
问题内容: 我有这张桌子(简体): 我需要从表中选择所有项目,并按以下方式排序: 1.价格> 0.00首先的项目,按价格ASC排序 2.价格= 0.00最后的项目,按ID排序 我尝试了这个: 我得到类似的结果 我如何建立查询 ? 感谢您的时间 问题答案: 这将达到目的。
问题内容: 在这里可以找到很多类似的问题,但是我认为没有一个人能够充分回答这个问题。 如果可以的话,我将继续从当前最受欢迎的问题开始,并使用其示例。 本例中的任务是获取数据库中每个作者的最新帖子。 该示例查询产生不可用的结果,因为它并不总是返回最新的帖子。 当前接受的答案是 不幸的是,这个答案是简单而简单的错误,并且在许多情况下产生的结果比原始查询更不稳定。 我最好的解决方案是使用形式的子查询 我
问题内容: 我需要移动现有列的位置(以获得更好的可见性)。 如何做到这一点而又不影响数据? 问题答案: 修改也可以。看一看: