Иной раз не знаешь где затупишь. Казалось бы простой запрос с использованием UNION, а потратил кучу времени, чтобы выяснить, почему он иногда не корректно отрабатывает.
Было:
|
$sql="select * from (select amount,local_date as date,managers.fio as tar_id,'enter' as type from payments inner join managers on payments.mod_person=managers.person_id where agrm_id='$agrm_id' UNION " . "SELECT amount,DATE_ADD(period, INTERVAL 1 DAY) as date,tarifs.descr as tarif,'inet' as type FROM rentcharge inner join tarifs on rentcharge.tar_id=tarifs.tar_id where rentcharge.agrm_id='$agrm_id' and amount<>0 UNION " . "select usbox_charge.amount,usbox_charge.charge_date,tarifs.descr as tarif,'tv' from usbox_charge inner join usbox_services on usbox_charge.serv_id=usbox_services.serv_id inner join tarifs on tarifs.tar_id=usbox_services.tar_id where usbox_charge.amount<>0 and usbox_charge.agrm_id='$agrm_id') as res order by date"; |
Стало:
|
$sql="select * from (select amount,local_date as date,managers.fio as tar_id,'enter' as type from payments inner join managers on payments.mod_person=managers.person_id where agrm_id='$agrm_id' UNION ALL " . "SELECT amount,DATE_ADD(period, INTERVAL 1 DAY) as date,tarifs.descr as tarif,'inet' as type FROM rentcharge inner join tarifs on rentcharge.tar_id=tarifs.tar_id where rentcharge.agrm_id='$agrm_id' and amount<>0 UNION ALL " . "select usbox_charge.amount,usbox_charge.charge_date,tarifs.descr as tarif,'tv' from usbox_charge inner join usbox_services on usbox_charge.serv_id=usbox_services.serv_id inner join tarifs on tarifs.tar_id=usbox_services.tar_id where usbox_charge.amount<>0 and usbox_charge.agrm_id='$agrm_id') as res order by date"; |
В чем соль? Оператор UNION без опции ALL оказывается обладает свойствами группировки одинаковых значений в запросе. Например у меня, при одинаковых одновременных значениях даты и суммы происходила группировка этих строчек в одну…