我有 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 查询来获取一个数组,该数组根据这些条件向我显示此结果:
- 按血型显示我们需要多少人
- 如果我们不需要任何 blood_group 或我们对该血型没有任何要求,则显示零(不显示 null)
- 没有显示我们血液短缺的负数
到目前为止我设法做到了这一点:
<?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 的总和,但这里是主要问题:
所以这里是主要问题:
- 如何减去(donates_amount 和 orders_amount)
- 如何让他们积极(先减去哪个)
- 即使一个血型未显示在另一个血型上(完全连接),如何显示结果
最佳答案
使用union all
和group 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/