gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:09:42 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com