连接表SQL PHP中列的总和不起作用[重复]

Posted

技术标签:

【中文标题】连接表SQL PHP中列的总和不起作用[重复]【英文标题】:The SUM of column in Join table SQL PHP not working [duplicate] 【发布时间】:2021-06-17 15:58:52 【问题描述】:

我正在尝试从表 table_two 中计算并获取列 count 的总和。我正在尝试通过Left Join 函数获取并获取列的总和。但它无法正常工作,并且我得到的列的总和存在于table_two 中。

我在left JOIN 的联合表中并不完美,请您帮助我了解如何在我的代码中使用联合函数。 我在这个 *** 上展示了多个线程,但相信我这很难理解而且非常大。这就是为什么我在这里制作一张小桌子以寻求帮助并且易于理解。

先生,请帮我不要将其标记为重复和关闭。我正在尝试过去 1 周,但没有代码工作。

我正在尝试的代码是 -

SELECT *, SUM(table_two.count) AS totalQTY, SUM(table_one.qty) AS totalReqQty 
    FROM table_one 
    LEFT JOIN table_two 
        ON table_one product_key = product_code 
    LEFT JOIN product_table 
        ON table_two.product_code = product_table.product_ids

table_one

|  ID  | product_key      |  insert_date |  qty 
|------|------------------|--------------|------
|  1   | 123456789        |  2021-02-01  |  150    
------------------------------------------------

table_two

|  ID  | product_code      |  add_date    |  count 
|------|-------------------|--------------|-------
|  1   | 123456789         |  2021-02-02  |   10
|  2   | 123456789         |  2021-02-03  |   20
|  3   | 123456789         |  2021-02-04  |   5
--------------------------------------------------

product_table

|  ID  | product_ids       |  product_name   
|------|-------------------|----------------------
|  1   | 123456789         |  XYZ
--------------------------------------------------

Expecting Output:

|  ID  | product_key       |  product_name  |  qty  | count |
|------|-------------------|---------------------------------
|  1   | 123456789         |  XYZ           |  150  |  35   | 
-------------------------------------------------------------

【问题讨论】:

【参考方案1】:

您尚未标记您正在使用的数据库,但是从每个数据库获取聚合的一种方法是使用 apply

我还建议您修改 ProductId 命名约定中的不一致之处,您将其称为 product_codeproduct_keyproduct_ids。决定如何称呼它并保持一致会让其他人更容易理解。

select p.product_ids as product_key, p.product_name, coalesce(q.Qty,0) totalQty, coalesce(c.[count],0) [Count]
from product_table p
outer apply (
    select sum(qty) Qty
    from table_one t1
    where t1.product_key=p.product_ids
    group by t1.product_key
)q
outer apply (
    select Sum(count) [count]
    from table_two t2
    where t2.product_code=p.product_ids
    group by t2.product_code
)c

【讨论】:

[ 意外字符错误 OQ 使用 mysql。这个[] 的东西是 SQL Server。【参考方案2】:

query you showed us 不起作用。

如果您想通过使用 aggregate functions(如 SUM())来汇总/汇总/您的数据,最好的办法是在没有它们的情况下运行查询。 For example

SELECT *
    FROM table_one 
    LEFT JOIN table_two 
        ON table_one.product_key = table_two.product_code 
    LEFT JOIN product_table 
        ON table_two.product_code = product_table.product_ids

你得到这个结果。请注意,它有三行,并且数量150 显示在所有三行中。

ID product_key insert_date qty ID product_code add_date count ID product_ids product_name
1 123456789 2021-02-01 150 1 123456789 2021-02-02 10 1 123456789 XYZ
1 123456789 2021-02-01 150 2 123456789 2021-02-03 20 1 123456789 XYZ
1 123456789 2021-02-01 150 3 123456789 2021-02-04 5 1 123456789 XYZ

然后,请记住,当您汇总多行时,这些行中的详细信息(例如,table_1.ID)不再有意义。三行加起来你要哪个ID?

所以你可以something like this

SELECT table_one.product_key, 
       SUM(table_two.count) totalQty,
       SUM(table_one.qty) totalReqQty
  FROM table_one 
  LEFT JOIN table_two 
           ON table_one.product_key = table_two.product_code 
  LEFT JOIN product_table 
           ON table_two.product_code = product_table.product_ids
 GROUP BY table_one.product_key

这给出了这个结果,这是不正确的——它是table_one.qty 的三倍和。您的 table_onetable_two 的 JOIN 导致了组合爆炸。

product_key totalQty totalReqQty
123456789 35 450 WRONG!

因此,您需要了解的是,您的***FROM table_one ... JOIN table_two ... JOIN product_table... 模式需要在table_onetable_twoproduct_table 中为每个产品连接一行。在此设置中,您可以使用 product_table。每个产品都有一行。

但其他表的每个产品可以有多行。所以你需要在子查询中对它们求和,然后加入子查询like this。

SELECT product_table.product_ids,
       table_two_summary.totalQty,
       table_one_summary.totalReqQty
  FROM product_table
  LEFT JOIN (
            SELECT product_code, SUM(count) totalQty
              FROM table_two
             GROUP BY product_code
       ) table_two_summary 
         ON product_table.product_ids = table_two_summary.product_code
  LEFT JOIN (
            SELECT product_key, SUM(qty) totalReqQty
              FROM table_one
             GROUP BY product_key
       ) table_one_summary 
         ON product_table.product_ids = table_one_summary.product_key

编辑如果您需要对汇总列进行过滤,您可以这样做like this。

SELECT product_table.product_ids,
       table_two_summary.totalQty,
       table_one_summary.totalReqQty
  FROM product_table
  LEFT JOIN (
            SELECT product_code, SUM(count) totalQty
              FROM table_two
             GROUP BY product_code
       ) table_two_summary 
         ON product_table.product_ids = table_two_summary.product_code
  LEFT JOIN (
            SELECT product_key, SUM(qty) totalReqQty
              FROM table_one
             GROUP BY product_key
       ) table_one_summary 
         ON product_table.product_ids = table_one_summary.product_key
 WHERE table_one_summary.totalReqQty > table_two_summary.totalQty

查看子查询如何分别汇总两个不同的表。如果你加入他们并总结他们,你会多次计算一些行。

【讨论】:

你让我开心,但是当我使用 where 条件和此代码 sum(table_one.qty) > sum(table_two.count) 时,它不起作用 请看我的编辑。而且,恕我直言,“不工作”并不是一个有意义的陈述。它可能意味着从“给出不正确的结果”到“抛出语法错误”到“让我的服务器着火并烧毁我的数据中心”。如果您检查代码错误并尝试给出更有意义的解释,您将获得技能。 但它不起作用table_one_summary.product_key不保存 请解决这个问题 但是您的代码显示空值https://www.db-fiddle.com/f/xd4rax25LYQQFRfxGv7erN/5 请查看您的 db_fiddle 并帮助我们改进这一点

以上是关于连接表SQL PHP中列的总和不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP- MySQL 数据库插入操作不起作用 [重复]

HQL - 按连接继承类型映射的实体分组不起作用

Informatica Cloud DB2 for i cdc 连接类型 SQL 覆盖不起作用

NativeQuery 删除重复的 Oracle SQL Db 表条目不起作用(参见代码)

PHP SQL 语句不起作用,但可以直接从 phpmyadmin [重复]

在 knexjs mysql 中取联合多列后总和不起作用