Чтобы ответить на ваш первый вопрос:
как вычесть (donates_amount и orders_amount)
Вы должны использовать функцию SUM () со знаком минус:
SUM(donates.amount - orders.amount);
это вычитает общую сумму из двух таблиц
Но у нас есть некоторая проблема: у вас могут быть нулевые значения (потому что у вас может не быть некоторых групп крови, присутствующих в одной из таблиц)которые дают неправильный результат.Вы должны изменить нулевые значения на ноль с помощью функции COALESCE ():
SUM(COALESCE(donates.amount,0) - COALESCE(orders.amount,0))
Мы должны дополнительно проверить, если результат не равен нулю:
COALESCE(SUM(COALESCE(donates.amount,0) - COALESCE(orders.amount,0)),0)
каксделайте их положительными (сначала вычтите, какое из них)
И наконец, если вы хотите избежать отрицательных чисел, вы должны использовать математические функции mysqli с именем ABS (), которые дают вам абсолютное значение:
ABS(COALESCE(SUM(COALESCE(donates.amount,0) - COALESCE(orders.amount,0)),0))
, поэтому ваш запрос будет выглядеть следующим образом:
$sql = "SELECT donates.blood_group as blood_group,
COALESCE(donates.amount,0) as donates_amount,
COALESCE(orders.amount,0) as orders_amount,
ABS(COALESCE(SUM(COALESCE(donates.amount,0) - COALESCE(orders.amount,0)),0)) as needed_amount
FROM `donates`
LEFT JOIN `orders`
ON donates.blood_group = orders.blood_group
GROUP BY donates.blood_group";
как показать результат, даже если одна группа крови не представлена в другой (полное объединение)
Чтобы выполнить полное объединение, вы должны использовать объединение с формой invers вашего запроса.так что вы найдете другие записи в таблице заказов и объедините результаты в один результат:
$sql = "SELECT donates.blood_group as blood_group,
COALESCE(donates.amount,0) as donates_amount,
COALESCE(orders.amount,0) as orders_amount,
ABS(COALESCE(SUM(COALESCE(donates.amount,0) - COALESCE(orders.amount,0)),0)) as needed_amount
FROM `donates`
LEFT JOIN `orders`
ON donates.blood_group = orders.blood_group
GROUP BY donates.blood_group
UNION
SELECT orders.blood_group as blood_group,
COALESCE(donates.amount,0) as donates_amount,
COALESCE(orders.amount,0) as orders_amount,
ABS(COALESCE(SUM(COALESCE(orders.amount,0) - COALESCE(donates.amount,0)),0)) as needed_amount
FROM `orders`
LEFT JOIN `donates`
ON orders.blood_group = donates.blood_group
GROUP BY orders.blood_group";