另一个涉及组合的复杂MySQL查询

另一个涉及组合的复杂MySQL查询,mysql,join,combinations,Mysql,Join,Combinations,假设我们有一张这样的桌子 connection_requirements +-----------------------------------+ | item_id | connector_id | quantity | +---------+--------------+----------+ | 1 | 4 | 1 | | 1 | 5 | 1 | | 1 | 2

假设我们有一张这样的桌子

connection_requirements
+-----------------------------------+ 
| item_id | connector_id | quantity | 
+---------+--------------+----------+ 
| 1       | 4            | 1        | 
| 1       | 5            | 1        | 
| 1       | 2            | 2        | 
+---------+--------------+----------+ 
此表列出了电子设备操作所需的连接器,以及每种类型的连接器所需的数量。(想想主板上需要电源提供特定类型连接器的连接)

现在我们还有这张桌子

connections_compatability 
+-------------------------+ 
| connector_id | works_as | 
+--------------+----------+ 
| 6            | 4        | 
| 6            | 5        | 
+--------------+----------+ 
其中,第一列是连接器,也可以用作第二列的连接器id。(例如,电源具有诸如“6+2针”之类的连接器,可以用作“8针”或“6针”)

现在我们终于知道这个表中有多少个连接器可用

connector_quantities 
+-------------------------+ 
| connector_id | quantity | 
+--------------+----------+ 
| 1            | 1        | 
| 2            | 3        | 
| 3            | 2        | 
| 4            | 1        | 
| 5            | 0        | 
| 6            | 4        | 
| 7            | 0        | 
| 8            | 5        | 
+--------------+----------+ 
根据这些表,正如您所推断的,我们确实有足够的连接器,用于1号项目的正常运行。尽管我们没有足够的连接器#5,但我们有4个连接器#6,它们可以用作连接器#4和#5

connection_requirements表连接到items表,我们如何筛选需要比可用连接更多连接的项?我们已经准备好了代码来过滤需要不可用连接器的项目

这个问题有更多层次的复杂性,所以我们试图简化这个问题


非常感谢所有的帮助

一种方法是确定物品的“真实”库存,包括其替代品。例如,第四部分的实际库存实际上是5:1部分4+4部分6。因此,利用这一点:

Select ...
From connection_requirements As CR
Where Not Exists    (
                    Select 1
                    From connector_quantities As Q1
                        Left Join   (
                                    Select C2.connector_id, C2.works_as, Q2.quantity
                                    From connections_compatibility As C2
                                        Join connector_quantities As Q2
                                            On Q2.connector_id = C2.connector_id
                                    ) As Subs1
                            On Subs1.works_as = Q1.connector_id
                    Where Q1.connector_id = CR.connector_id
                        And ( Coalesce(Subs1.quantity, 0) + Q1.quantity ) > CR.quantity
                    )

这种方法当然有一个缺点。假设您有一个由以下部分组成的项目:
4个连接器和2个6个连接器
。从技术上讲,您确实有4个连接器(1个4和3个6替换),但结合2个6连接器的要求,您没有足够的零件。要解决此问题,您可能必须使用循环或多个查询,在用完所有主要零件后确定现有库存。

您的缩进样式失控。特别是在这样的地方,东西会滚动到看不见的地方。最没有帮助的。@Johan-什么滚动?查询不会在我的视图上滚动。显然,缩进样式是个人的偏好,但它使分离所需的派生表变得更容易。另外,MySQL不允许我在左连接中添加内部连接,以便首先处理内部连接。例如,我必须使用添加缩进的派生表。@托马斯,滚动取决于浏览器设置。在我的默认设置下,它很快开始旋转。@Johan-很有趣。我不会在FF4或IE9中滚动,但我会在Chrome和IE8中滚动一点。与其说是浏览器设置,不如说是浏览器本身。@Thomas,我有FF4,这取决于缩放设置。