【问题标题】:How do I combine several MySQL tables of varying rows?如何组合多个不同行的 MySQL 表?
【发布时间】:2014-03-19 10:32:54
【问题描述】:

我需要从几个定期更新库存的仓库中汇总数量。这些文件会自动加载到我的 MySQL 数据库中的表中,但有时一个仓库的文件可能比其他仓库多或少。我需要将它们全部添加,以确定整个网络的可用总量。

我的想法是:

    SELECT
        IFNULL(branch_01.qty,0) +
        IFNULL(branch_02.qty,0) +
        IFNULL(branch_03.qty,0) +

等等。通过所有仓库加入:

    FROM branch_01 
        JOIN branch_02
        USING (oespaced)
        JOIN branch_03 
        USING (oespaced)

等等。通过所有仓库

我不能使用 LEFT JOIN 或 RIGHT JOIN,因为有时一个仓库可能缺少条目,有时另一个仓库可能缺少条目。如果一个分支的文件中缺少 sku,我希望仍然将其他分支添加在一起,并且只获得一个 NULL,它将通过 SELECT 中的函数转换为 0。当我测试了不同的连接解决方​​案时,我似乎也得到了笛卡尔行数,这让我更加困惑。 非常感谢任何指导。

稍微澄清一下: 我们需要加入 17 个表。我们并不真正关心列的总和,而是更关心单个值。例如,一个表可能表示项目 a、b、c、d 的列表,并列出数量为 1、2、3、4。我们会从几个不同的仓库中获得该表,并且我们需要找到整个网络的总数。如果四个仓库具有这些值,我们希望看到 a、b、c、d 和 4、8、12、16 作为可用总数的值。

【问题讨论】:

  • 我明白为什么 LEFT JOIN 和 RIGHT JOIN 对您不起作用 - 但您是否尝试过 FULL OUTER JOIN?
  • 我认为 FULL OUTER JOIN 将是一个很好的解决方案,但据我了解,MySQL 不支持,它将通过在左侧执行 LEFT JOIN 和 RIGHT JOIN 来实现在右边。
  • 感谢您的澄清 - 不幸的是,它仍然很不清楚。我认为一个具体的例子(表 t1 有列 c1、c2 和值(v1a、v2a)、(v1b、v2b),表 t2 有列......等)会有所帮助。无论如何,如果正确的解决方案是 FULL OUTER JOIN,而在 MySQL 中你做不到,那么模拟它(正如你自己提到的)。

标签: mysql join left-join union right-join


【解决方案1】:

我不完全理解您的问题,但希望我的回答对您有所帮助。 您要加入许多表吗?那么假设有 2 个表,你想总结数量列?

首先,JOIN 执行 2 个(或更多)表的笛卡尔积。所以你会得到很多你不想拥有的实例;解决方案是使用WHERE

也许这就是你要找的东西:

SELECT sum(a.qty) + sum(b.qty)
FROM table1 a, table2 b
WHERE a.pk = b.fk -- this one resolves the unwanted instances

fk 表示外键,pk 表示主键。

【讨论】:

  • 非常感谢@krato 的建议。我编辑了我原来的问题,希望能增加一点说明。您建议的 WHERE 可能是答案,但我不知道如何处理我们糟糕的数据,因为一个分支可能只报告 a、b、c,而另一个可能只报告 b、c 等。如果一个分支没有t 报告一个项目,我们仍然需要知道来自其他分支的值,而不是让它们从结果中省略。
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多