【问题标题】:MySQL Join is multiplying the resultMySQL Join 将结果相乘
【发布时间】:2014-09-30 16:52:04
【问题描述】:

我在将两个表连接在一起时遇到问题,它不断增加我的值“qtyFulfillable”。

1st,当我运行这个查询时,我得到了正确的结果:sumQF = 85

 SELECT fbai.id, 
        fbai.sku,
        CASE WHEN SUM(fbai.qtyFulfillable) > 0 THEN SUM(fbai.qtyFulfillable) ELSE 0 END AS sumQF
 FROM FBAInventory fbai
 WHERE fbai.fbaInventoryReport_id = 62010
 AND     fbai.sku = 'ELO-250030'
 GROUP BY fbai.id
 ORDER BY sumQF DESC

但是当我开始加入连接时,我现在得到:sumQF = 14110

 SELECT fbai.id, 
        fbai.sku,
        CASE WHEN SUM(fbai.qtyFulfillable) > 0 THEN SUM(fbai.qtyFulfillable) ELSE 0 END AS sumQF, 
        CASE WHEN   SUM(fbas.quantityShipped) > 0 THEN SUM(fbas.quantityShipped) ELSE 0 END as sumQS
 FROM FBAInventory fbai
 LEFT JOIN  FBAShipment fbas
 ON fbai.sku = fbas.sku
 WHERE fbai.fbaInventoryReport_id = 62010
 AND     fbai.sku = 'ELO-250030'
 GROUP BY fbai.id
 ORDER BY sumQF DESC

由于某种原因,sql 将“fbas”表(连接表)中的总行数设为 166 行,然后乘以 85 x 166 = 14110

我需要做些什么才能加入此表,但不能将我的结果乘以加入表中的总行数。谢谢!

【问题讨论】:

  • 您使用的是 MySQL 还是 SQL Server?请不要标记两个完全不同的数据库平台,除非你真的同时使用这两个平台。
  • 如果 FBAInventory 有 85 条 SKU='ELO-250030' 的记录,那么对于这 85 行中的每一行,它都会尝试加入 FBAShipment 中具有相同 sku 的行。在连接的“ON”子句中必须有一些其他字段对。
  • 将 fbas.sku 添加到 GROUP BY 子句是否可以解决问题? IE。 GROUP BY fbai.id, fbas.sku

标签: mysql sql join


【解决方案1】:

您可以在单独的查询中总结第二个数量,然后将其添加到 JOIN 中。我还喜欢使用 GREATEST 而不是您的 CASE 语句。

    SELECT fbai.id,
           fbai.sku,
           GREATEST(SUM(fbai.qtyFulfillable),0) sumQF,
           COALESCE(fbas_sum.value,0) sumQS /* COALESCE in case no rows */
      FROM FBAInventory fbai
 LEFT JOIN (
        SELECT sku,
               GREATEST(SUM(quantityShipped),0) value
          FROM FBAShipment
      GROUP BY sku
           ) fbas_sum
        ON fbas_sum.sku=fbai.sku
     WHERE fbai.fbaInventoryReport_id=62010
       AND fbai.sku='ELO-250030'
  GROUP BY id, sku, sumQS /* Added other non-aggregates for sanity */
  ORDER BY sumQF DESC

您确定要在id 上进行分组吗?我会假设id 是表的主键,所以应该只有一行来求和。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2015-08-15
    • 2013-10-07
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多