【问题标题】:Another complex MySQL query involving combinations另一个涉及组合的复杂 MySQL 查询
【发布时间】:2011-06-08 18:03:06
【问题描述】:

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

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 Pin”,可以用作“8 Pin”或“6 Pin”)

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

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

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

非常感谢所有帮助!

【问题讨论】:

    标签: mysql join combinations


    【解决方案1】:

    一种方法是确定物品的“真实”库存,包括它们的替代品。例如,第 4 部分的实际库存实际上是 5:1-part #4 + 4-part #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 连接器的要求,您没有足够的零件。要解决此问题,您可能必须使用循环或多个查询来确定您用完所有主要部件后的现有库存。

    【讨论】:

    • 你的缩进风格失控了。特别是。在 SO 中,东西滚动到视野之外。最没用的。
    • @Johan - 什么滚动?查询不会在我的视图上滚动。显然,缩进样式是个人喜好,但 IMO 更容易分隔所需的派生表。此外,MySQL 不允许我向左连接添加内连接,以便首先处理内连接。即,我必须使用添加缩进的派生表。
    • @Thomas,滚动取决于浏览器设置。在我的默认设置下,它会很快开始滚动。
    • @Johan - 很有趣。我不会在 FF4 或 IE9 中滚动,但我会稍微滚动一下 Chrome 和 IE8。与其说是浏览器设置,不如说是浏览器本身。
    • @Thomas,我有 FF4,这取决于缩放设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2013-03-27
    相关资源
    最近更新 更多