当前位置: 首页 > 面试题库 >

MySQL排列

洪河
2023-03-14
问题内容

我有两张桌子。一个拥有产品,另一个拥有捆绑产品。我需要弄清楚允许我找到所有可以出售附加产品的组合的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 将数字表ut(单位和十进制)生成的元素限制为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排序 我尝试了这个: 我得到类似的结果 我如何建立查询 ? 感谢您的时间 问题答案: 这将达到目的。

  • 问题内容: 在这里可以找到很多类似的问题,但是我认为没有一个人能够充分回答这个问题。 如果可以的话,我将继续从当前最受欢迎的问题开始,并使用其示例。 本例中的任务是获取数据库中每个作者的最新帖子。 该示例查询产生不可用的结果,因为它并不总是返回最新的帖子。 当前接受的答案是 不幸的是,这个答案是简单而简单的错误,并且在许多情况下产生的结果比原始查询更不稳定。 我最好的解决方案是使用形式的子查询 我

  • 问题内容: 我需要移动现有列的位置(以获得更好的可见性)。 如何做到这一点而又不影响数据? 问题答案: 修改也可以。看一看: