Выборка из 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 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів