работа с двумя таблицами mysql

310
26 ноября 2016, 20:18

Есть две таблицы:

  1. счета (каждый с уникальным айди и суммой которую нужно заплатить).

  2. оплаты по этим счетам, проведенные с указанием айди счета и суммой оплаты (у каждой оплаты есть свой айди, у одного счета может быть несколько оплат).

Вопрос: как вывести список счетов, в котором будет видно сумму всех оплат по данному счету и сколько осталось выплатить (то-есть разницу суммы счета и суммы всех оплат)?

пробовал сделать так:

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
Answer 1
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() возвращающая дату без времени)

Answer 2

Попробуйте такой запрос

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 
Answer 3

С помощью подзапроса можно находить сумму. Т.е. проходим по счетам, для каждого счёта суммируем сумму платёжек

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;
READ ALSO
Как реализовать вывод данных из MySQL

Как реализовать вывод данных из MySQL

!!!РЕШЕНО Дано: таблица mysql и три поля

294
Получение данных из внешней базы в Rails

Получение данных из внешней базы в Rails

Мне необходимо получить/обновить/удалить данные во внешней базе, никак не относящийся к базе самого приложенияНеобходимо к ней обращаться...

247
MySQL: GROUP BY устовия для COUNT(*)

MySQL: GROUP BY устовия для COUNT(*)

Как задать максимальный и минимальный размеры группы, чтобы получить записи, где count < 5 и count > 2?

310
Условие IF в триггере

Условие IF в триггере

Я вставляю данные в таблицу:

266