php - 如何使用 mysqli 和 php(仅使用查询)基于另一列对两个表中的一列进行连接和求和

标签 php mysql sql join full-outer-join

我有 2 个关于血库的表格:

  1. 捐赠
  2. 订单

在捐赠表中,我有 2 个字段显示我们有多少捐赠:

------------------------
| blood_group | amount |
------------------------
|    A+       |   2    |
|    B-       |   3    |
|    O+       |   4    |
|    A+       |   3    |
|    O+       |   1    |

在订单表中,我有 2 列表示我们根据血型提交了多少请求:

------------------------
| blood_group | amount |
------------------------
|    A+       |   4    |
|    B-       |   3    |
|    O+       |   4    |
|    AB-      |   6    |

我的问题是我想使用 mysqli 查询来获取一个数组,该数组根据这些条件向我显示此结果:

  1. 按血型显示我们需要多少人
  2. 如果我们不需要任何 blood_group 或我们对该血型没有任何要求,则显示零(不显示 null)
  3. 没有显示我们血液短缺的负数

到目前为止我设法做到了这一点:

<?php
$con = mysqli_connect("localhost", "root", "", "test");
// Check connection
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql ="SELECT donates.blood_group as blood_group,
                donates.amount as donates_amount,
                orders.amount as orders_amount,
                                    FROM `donates`
                                    LEFT JOIN `orders` 
                                    ON donates.blood_group = orders.blood_group
                                    GROUP BY donates.blood_group";
// Perform queries
$result = mysqli_query($con, $sql);

if (!$result = mysqli_query($con, $sql)) {
    echo "SQLSTATE error: " . mysqli_sqlstate($con);
    echo "<br>";
    echo "SQLSTATE error: " . mysqli_error($con);
    exit;
}

$result = mysqli_fetch_all($result, MYSQLI_ASSOC);

var_dump($result);

mysqli_close($con);

该查询向我显示了 blood_groups 的总和,但这里是主要问题:

所以这里是主要问题:

  1. 如何减去(donates_amount 和 orders_amount)
  2. 如何让他们积极(先减去哪个)
  3. 即使一个血型未显示在另一个血型上(完全连接),如何显示结果

最佳答案

使用union allgroup by:

select blood_group, sum(donate_amount) as donate_amount,
       sum(order_amount) as order_amount
from ((select blood_group, amount as donate_amount, 0 as order_amount
       from donates
      ) union all
      (select blood_group, 0 as donate_amount, amount as order_amount
       from orders
      )
     ) od
group by blood_group;

唯一需要注意的是血型需要在其中一张表格中。如果你有一个包含所有这些的单独表格,你应该使用它。例如:

select bg.*,
       coalesce(donate_amount, 0) as donate_amount,
       coalesce(order_amount, 0) as order_amount
from blood_groups bg left join
     (select blood_group, sum(amount) as donate_amount
      from donates
      group by blood_group
     ) d
     on d.blood_group = bg.blood_group left join
     (select blood_group, sum(amount) as order_amount
      from donates
      group by blood_group
     ) o
     on o.blood_group = bg.blood_group ;

在这两个查询中的任何一个中,您都可以使用 - 获取差值,并使用 greatest() 将负数显示为 0。例如:

greatest(sum(donate_amount) - sum(order_amount), 0)

关于php - 如何使用 mysqli 和 php(仅使用查询)基于另一列对两个表中的一列进行连接和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55982604/

相关文章:

php - 在 WordPress 管理面板中隐藏默认内容文本区域

php - 如何更改 While 循环内的单行数组变量并使用新结果更新数据库表

javascript - 我可以循环遍历数据表列对象并添加+2的新行添加吗

mysql - 在 wordpress 数据库中的 INSERT 查询中获取 SQL 语法错误

php - 发布仅返回较旧的结果

php - 根据 Select DropDown 使用 PHP 变量

php - 删除语句显示删除成功,但不删除记录

php - 如何在mysql中使用内连接从一个表中获取总和

java - 一个在intelliJ中运行但不在cmd中运行的java应用程序

sql - 将平面表解析为树的最有效/优雅的方法是什么?