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

时间:2011-06-08 18:03:07

标签: mysql join combinations

假设我们有一个看起来像这样的表

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表,我们如何过滤需要比我们可用的更多连接的项目?我们已经有代码来过滤需要不可用连接器的项目。

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

非常感谢所有人的帮助!

1 个答案:

答案 0 :(得分:0)

一种方法是确定项目的“真实”库存,包括其替换。例如,第4部分的实际库存实际上是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 #4 connectors and 2 #6 connectors的物品。从技术上讲,你有4#4连接器(1#4和3#6替换),但结合2#6连接器的要求,你没有足够的部件。要解决此问题,您可能必须使用循环或多个查询,这将在您用完所有主要部件后确定现有库存。