Выборка из MySQL в диапазоне дат
Добрый день, есть таблица в формате
CREATE TABLE IF NOT EXISTS `statistic` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_user` int(11) NOT NULL, `id_org` int(11) NOT NULL, `id_driver` int(11) NOT NULL, `coins` int(11) NOT NULL, `data` bigint(20) NOT NULL, UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=20110 ;сейчас делаю простую выборку из таблицы по ИД таким запросом
$result = $connection->query("SELECT * FROM statistic WHERE `id_user`=".$users[$i]['id']);И есть даты в диапазоне которых нужно сделать выборку к примеру
Вопрос: каким образом возможно сформулировать запрос, чтоб в результате получить только нужную выборку данных.
АП:
Суть в чому, тип поля з датою і збереження її такому форматі була однією з вимог замовника... тут нічого не поробиш, уперся і все....
По багатьох інших питаннях, дійсно мало що знаю, індекси, унікальні поля і тому подібне можливо не вірно сформував...
просто з самого початку була задача, просто сформувати таблицю статистики яка б фіксувала кількість певних дій для конкретних Працівників організаці...
Тобто є
Юзер (клієнт)
Його орагнізація,
Працівник організаціїї...
Ну і кількість операцій виконаних даним працівником за день. Це значення записується в поле coins...
При чому поля Організації і Працівників ніяк не можуть бути унікальними, вони можуть співпадати для різних юзерів...
Вирішив проблему можливо «топорно», зате працює...
1. Дати діапазон передаються формую через різні поля...
$start=$day.'-'.$mes.'-'.$god; $start=date("d.m.Y", strtotime($start)); $end=$day2.'-'.$mes2.'-'.$god2; $end=date("d.m.Y", strtotime('+1day', strtotime($end))); if ($start==$end){ $dates[]=$start; } $start = new DateTime($start); // Дата окончания интервала $end = new DateTime($end); // Интервал в один день $step = new DateInterval('P1D'); // Итератор по дням $period = new DatePeriod($start, $step, $end); // Вывод дней foreach($period as $datetime) { //echo $datetime->format("d.m.Y")."<br />"; $dates[]=$datetime->format("d.m.Y"); } if ($dates[0]=='01.01.1970'){ $dates=array(); }
Далі просто циклі
$result = $connection->query("SELECT * FROM statistic WHERE `id_org`=".$org." AND `id_user`=".$uid." AND `id_driver`=".$users[$i]['id']); //Просто роблю вибірку всіх записів які відповідають данному працівникові while ($row2 = $result->fetch_assoc()) { if (count($dates)>0){ $usersdate=date("d.m.Y", $row2['data']); // дата в БД for ($j = 0; $j <count($dates); $j++) { $ndata=$dates[$j]; // одна з дат в діапазоні if(stristr($usersdate, $ndata) === FALSE) { // нічого не роблю (заготовка для подальших забагань замовника) // можливо тут потрібно убде також щось підраховувати }else { $coins=$coins+$row2['coins']; // підраховую кількість операцій для статистики $users[$i]['date']=date("d-m-Y", $row2['data']); // хаписую дату останньої операції } } }else{ // це якщо діапазон дат не задано, то виводу статистику за весь період... $coins=$coins+$row2['coins']; $users[$i]['date']=date("d-m-Y", $row2['data']); } }
можливо код і виглядає жахливо, зате працює ))) я самоучка в Веб програмуванні... в технікумі нажаль крім Паскаля і Делфі більше нічого не навчили, прийшлося все опановувати самому...
ПС: Дякую всім за таку дискусію, і океан корисної інформації, буду вивчати!!!
146 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів