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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помочь с запросом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Flash_PR
Отправлено: 23 Марта, 2016 - 16:37:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 328
Дата рег-ции: Окт. 2013  
Откуда: Санкт-Петербург


Помог: 6 раз(а)




Добрый день 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

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

ЗЫ: Т.е. у меня стоит задача получить данные за промежуток времени, даже если на определеную дату ничего нет.

(Отредактировано автором: 23 Марта, 2016 - 16:47:54)



-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
Мелкий Супермодератор
Отправлено: 23 Марта, 2016 - 16:55:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Mysql? Только какими-то невнятными костылями. Если очень надо, то можно. Но проще на приложении. Например, сгенерировать таблицу дат из одного поля типа date и к ней left join'ить аггрегацию по данным.

Под postgresql - элементарный generate_series


-----
PostgreSQL DBA
 
 Top
Flash_PR
Отправлено: 23 Марта, 2016 - 16:59:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 328
Дата рег-ции: Окт. 2013  
Откуда: Санкт-Петербург


Помог: 6 раз(а)




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

Ну в общем сейчас на приложении и есть. Думал есть в mysql функция итерации дат, о которой не знал. Ладно, спасибо все равно. Нельзя, так нельзя....решим по другому.


-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
OrmaJever
Отправлено: 23 Марта, 2016 - 21:09:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Мелкий пишет:
Только какими-то невнятными костылями.

А это разве сильно костыль?
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

(Отредактировано автором: 23 Марта, 2016 - 21:32:06)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 23 Марта, 2016 - 21:36:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




OrmaJever пишет:
А это разве сильно костыль?

Что будет, если в таблице не будет ни одной записи за какую-нибудь дату?
Правильно, этой даты не будет в результате. А вопрос в том, как сделать, чтобы дата в выборке была, но с count=0


-----
PostgreSQL DBA
 
 Top
OrmaJever
Отправлено: 23 Марта, 2016 - 22:13:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Мелкий пишет:
А вопрос в том, как сделать, чтобы дата в выборке была, но с 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.  

(Отредактировано автором: 23 Марта, 2016 - 22:28:04)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 24 Марта, 2016 - 09:48:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




OrmaJever пишет:
Забирать из базы всё что есть, а затем в php циклом по этому же интервалу дополнять не существующие ячейки

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


Для postgresql - да, такое.


-----
PostgreSQL DBA
 
 Top
Flash_PR
Отправлено: 24 Марта, 2016 - 10:48:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 328
Дата рег-ции: Окт. 2013  
Откуда: Санкт-Петербург


Помог: 6 раз(а)




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 сделать наверное, но это будет костыль.

(Отредактировано автором: 24 Марта, 2016 - 10:59:24)



-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB