Есть две таблицы:
счета (каждый с уникальным айди и суммой которую нужно заплатить).
оплаты по этим счетам, проведенные с указанием айди счета и суммой оплаты (у каждой оплаты есть свой айди, у одного счета может быть несколько оплат).
Вопрос: как вывести список счетов, в котором будет видно сумму всех оплат по данному счету и сколько осталось выплатить (то-есть разницу суммы счета и суммы всех оплат)?
пробовал сделать так:
global $wpdb;
$rates_sql = $wpdb->get_results("SELECT * FROM factures LEFT JOIN payment ON payment.facture_date=factures.letter_id AND payment.facture_number=factures.id_number WHERE '$date'<='$date_now'"); }
foreach ($rates_sql as $result) {
$refuseInter=$result->refuse_inter;
$refusePay=$result->refuse_pay;
$prepayment=$result->prepayment;
$sendCourier=$result->send_courier;
$expDate=$result->exp_date;
$firstIntervDate= $result->first_interv;
$date = date('Y-m-d', strtotime($firstIntervDate. "+ ".$expDate."days"));
$date_now = date("Y-m-d");
$payment=$result->check_sum; if ($result->tarif_ttc - $results->summary!=0) {
?>
<td><?php echo $result->cliend_id; ?></td>
<td><?php echo $result->id_number; ?></td>
<td><?php echo $result->name; ?></td>
<td><?php echo $result->add_code; ?></td>
<td><?php echo $results->summary; ?></td>
<td><?php echo $result->tarif_ttc - $results->summary ?></td>
<td><?php if ($refuseInter == 0) { ?>
но в таком случае в таблице повторяются фактуры у которых две или более проплат. помогите, пожалуйста, просуммировать данные проплаты и привязать их к одному счету.
структуры таблиц:
таблица factures
имеет колонки:
letter_id,
id_number,
cliend_id,
task,
metier,
check_num,
conceil,
nex_intervent,
creation_date,
name,
add_num,
add_street,
add_code,
add_city,
hotte_number,
tarif_ht,
tariv_tva,
tarif_ttc,
first_interv,
exp_date,
refuse_inter,
refuse_pay,
prepayment,
send_courier
таблица payment
имеет колонки:
id_payment,
ID,
name,
facture_date,
facture_number,
zip-code,
contrat_by_courier,
check_get_pay,
cb_got,
virement_got,
prelevement_got,
lcr_got,
check_number,
payment_date,
send_facture_by_courier,
send_facture_by_mail,
send_attestation_by_courier,
send_attestation_by_mail,
check_sum,
bank_name,
check_num,
date_cashed
SELECT factures.letter_id, factures.id_number,
tarif_ttc, ...остальные.необходимые.поля... ,
SUM(payment.check_sum) as summary,
tarif_ttc - coalesce(SUM(payment.check_sum),0) as needToPay
FROM factures
LEFT JOIN payment ON payment.facture_date=factures.letter_id
AND payment.facture_number=factures.id_number
WHERE '$date'<='$date_now'
GROUP BY factures.letter_id, factures.id_number
Не надо выбирать из таблиц *
, всегда указывайте те колонки, которые вам нужны. Во первых это ускоряет передачу данных от MySQL к вашему приложению, во вторых, вы будете точно представлять какие колонки вообще есть и не попытаетесь обращаться к некоей $result->summary
которой в выборке нет (у вас нет, у меня есть).
Если в вашем MySQL включена опция ONLY_FULL_GROUP_BY
то вам будет необходимо перечислять в group by все колонки к которым не применены групповые функции и которые присутствуют в списке выборки, а *
в group by указывать нельзя и в итоге вам будет необходимо перечислить все колонки таблицы factures.
Если же ONLY_FULL_GROUP_BY
выключена то в GROUP BY можно указать только колонки однозначно обеспечивающие уникальность записей счетов (я включил колонки исходя из предположения, что это дата и номер счета, хотя названия у них странные). Для остальных колонок, не включенных в group by и без групповых функций MySQL возьмет первое попавшееся значение, в нашем случае этого достаточно, т.к. group by обеспечивает уникальность счетов.
И еще у вас какое то дикое условие в where
. Если $date
будет меньше $date_now
- то запрос вернет все строки таблицы. Если же он окажется больше - то ни одной. Думаю вам надо в сравнении использовать какие либо колонки с датами из таблицы счетов. А уж переменная $date_now
совершенно точно не нужна, потому как в MySQL есть функция now()
возвращающая текущую дату-время (и current()
возвращающая дату без времени)
Попробуйте такой запрос
SELECT SUM(payment.check_sum)
FROM factures
LEFT JOIN payment ON payment.facture_date=factures.letter_id
AND payment.facture_number=factures.id_number
GROUP BY letter_id
С помощью подзапроса можно находить сумму. Т.е. проходим по счетам, для каждого счёта суммируем сумму платёжек
SELECT *,
(SELECT SUM(summary) FROM payment WHERE payment.facture_date=factures.letter_id AND payment.facture_number=factures.id_number) AS payment_summary
FROM factures;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне необходимо получить/обновить/удалить данные во внешней базе, никак не относящийся к базе самого приложенияНеобходимо к ней обращаться...
Как задать максимальный и минимальный размеры группы, чтобы получить записи, где count < 5 и count > 2?