Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помочь с запросом
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Помочь с запросом

Страниц (1): [1]
 

1. Flash_PR - 23 Марта, 2016 - 16:37:50 - перейти к сообщению
Добрый день all!
У меня сейчас есть реализация запроса (MySQL), но вот подумал а нельзя ли его упростить? А как не знаю, вполне возможно что и нельзя.

Допустим есть пустая таблица с полем id и date (таймштамп). Возможен ли такой запрос, чтобы получить массив дата в формате день-месяц и количество id за эту дату. Но так как таблица пустая количество будет 0;
Т.е. в результате массив результата запроса за последние 10 дней
date = 14.03
count_id = 0

date = 15.03
count_id = 0

date = 16.03
count_id = 0
.......
date = 23.03
count_id = 0

Если бред спросил, соори....

ЗЫ: Т.е. у меня стоит задача получить данные за промежуток времени, даже если на определеную дату ничего нет.
2. Мелкий - 23 Марта, 2016 - 16:55:28 - перейти к сообщению
Mysql? Только какими-то невнятными костылями. Если очень надо, то можно. Но проще на приложении. Например, сгенерировать таблицу дат из одного поля типа date и к ней left join'ить аггрегацию по данным.

Под postgresql - элементарный generate_series
3. Flash_PR - 23 Марта, 2016 - 16:59:21 - перейти к сообщению
Мелкий пишет:
Mysql? Только какими-то невнятными костылями. Если очень надо, то можно. Но проще на приложении. Например, сгенерировать таблицу дат из одного поля типа date и к ней left join'ить аггрегацию по данным.

Ну в общем сейчас на приложении и есть. Думал есть в mysql функция итерации дат, о которой не знал. Ладно, спасибо все равно. Нельзя, так нельзя....решим по другому.
4. OrmaJever - 23 Марта, 2016 - 21:09:25 - перейти к сообщению
Мелкий пишет:
Только какими-то невнятными костылями.

А это разве сильно костыль?
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT count(*), date_format(date_row, '%d.%m') d
  3. FROM table_name
  4. WHERE date_row BEETWEN 'от' AND 'до'
  5. GROUP BY d
5. Мелкий - 23 Марта, 2016 - 21:36:44 - перейти к сообщению
OrmaJever пишет:
А это разве сильно костыль?

Что будет, если в таблице не будет ни одной записи за какую-нибудь дату?
Правильно, этой даты не будет в результате. А вопрос в том, как сделать, чтобы дата в выборке была, но с count=0
6. OrmaJever - 23 Марта, 2016 - 22:13:33 - перейти к сообщению
Мелкий пишет:
А вопрос в том, как сделать, чтобы дата в выборке была, но с count=0

Забирать из базы всё что есть, а затем в php циклом по этому же интервалу дополнять не существующие ячейки Улыбка
(Добавление)
Мелкий а для постгре ты предлагаешь примерно такой вариант?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT coalesce(count(t.id), 0) count, date_format(t.date_row, '%d.%m') d
  2. FROM generate_series('от', 'до', '1 day') gs
  3. LEFT JOIN table_name t
  4.     ON t.date_row = gs.что-то там
  5.  
7. Мелкий - 24 Марта, 2016 - 09:48:17 - перейти к сообщению
OrmaJever пишет:
Забирать из базы всё что есть, а затем в php циклом по этому же интервалу дополнять не существующие ячейки

Ага. Ну я и говорю:
Мелкий пишет:
Если очень надо, то можно. Но проще на приложении.


Для postgresql - да, такое.
8. Flash_PR - 24 Марта, 2016 - 10:48:30 - перейти к сообщению
OrmaJever пишет:
А это разве сильно костыль?

Именно такой и есть у меня запрос, но мелкий правильно сказал, что при пустой таблице ничего не будет. Или если за какое то число не будет записей, то этой даты не будет. А так как данные используются для построения графика, нужно без прерываний по датам.
В общем оставил как было изначально. Выборка-> цикл за нужный период.

PHP:
скопировать код в буфер обмена
  1. for ($i = $days; $i >= 0; $i--){
  2.     $tmp = array(
  3.         'date' => date('d.m', strtotime("-$i day")),
  4.         'host' => 0,
  5.         'hit' => 0,
  6.     );


Временный массив куда записываю дату и количество 0. Дальше проверяю с выборкой из базы, если на эту дату есть какая то сумма из базы, перезаписываю количество.

ЗЫ: Хотелось именно про несуществующие даты в базе, что бы при выборке дополнялись с нулевым количеством. Но мелкий сразу сказал что только костылями, или как сразу сделал на приложении. Можно конечно через UNION сделать наверное, но это будет костыль.

 

Powered by ExBB FM 1.0 RC1