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]   

> Описание: Все работает, не хватает 3х элементов
Tox
Отправлено: 17 Апреля, 2012 - 12:59:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




Таблица в бд имеет следующий вид: поле id(первичный кей), поле date (тип DateTime), watches (int). Каждые 10 минут скрипт записывает в бд текущую дату (2012-04-17 13:53:00) и данные из статистики(внешней). Все работает, все пишется. Начал выводить данные из бд следующим sql-запросом:
PHP:
скопировать код в буфер обмена
  1. $q = mysql_query("SELECT date_format(`date`, '%H') AS `hour`, date_format(`date`, '%Y-%m-%d %H:%i:%S') AS `date`, sum(`watches`) AS `hour_watches` FROM table GROUP BY `hour` having `date`>NOW()-INTERVAL 1 DAY ORDER BY `date` ASC;");

То есть по сути суммируем watches, группируем по часам, начиная с самой старой даты.
Потом выводом в массив:
PHP:
скопировать код в буфер обмена
  1. while ($row = mysql_fetch_assoc($q)){
  2. $ARR[0]=$row['hour_watches'];
  3. $ARR["x"]=$row['hour'];

А на выходе получается 21 массив, а не 24! Я 100 раз бд проверил, за день должно вывестись 24 массива (в бд данные есть!).
Что это за прикол, пожалуйста, объясните


-----
In Console We Trust. Code hard. Or die.
 
 Top
Мелкий Супермодератор
Отправлено: 17 Апреля, 2012 - 13:21:03
Post Id



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


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


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




0) phpfaq.ru/debug
1) смотрите сырой результат запроса
2) массив по представленному коду должен быть один и состоять из 2 элементов
3) крайне подозрительно смотрю на поле date, переопределяемое непонятно на что (именно непонятно на что, может использоваться любая строка) после группировки и потом по этому же значению отсекает having тех, кто ему не нравится. Что может привести и, видимо, приводит, к непредсказуемому результату выборки.

Не имеющие отношения к решению советы:
0) не используйте having там, где достаточно where, первый не использует индексы
1) использование now() ставит крест на кэше запросов, тогда как ваш запрос замечательно можно кэшировать


-----
PostgreSQL DBA
 
 Top
Tox
Отправлено: 17 Апреля, 2012 - 16:59:16
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




Спасибо, поменял запрос, сработало:
PHP:
скопировать код в буфер обмена
  1. $q = mysql_query("SELECT date_format(`date`, '%Y-%m-%d %H') AS `hour`, sum(`watches`) AS `hour_watches` FROM table GROUP BY `hour` having `hour`>NOW()-INTERVAL 24 HOUR;");

И сам цикл, теперь это один массив. Проблема в том, что дата записывается в виде "2012-04-15 17", можно как-нибудь "укоротить" до "17"? Да, знаю про регулярки, а с помощью sql?


-----
In Console We Trust. Code hard. Or die.
 
 Top
EuGen Администратор
Отправлено: 17 Апреля, 2012 - 17:34:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




PHP:
скопировать код в буфер обмена
  1. $q = mysql_query("SELECT date_format(`date`, '%H') AS `hour`, sum(`watches`) AS `hour_watches` FROM table GROUP BY `hour` having `hour`>NOW()-INTERVAL 24 HOUR;");

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Tox
Отправлено: 17 Апреля, 2012 - 17:38:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




EuGen пишет:
PHP:
скопировать код в буфер обмена
  1. $q = mysql_query("SELECT date_format(`date`, '%H') AS `hour`, sum(`watches`) AS `hour_watches` FROM table GROUP BY `hour` having `hour`>NOW()-INTERVAL 24 HOUR;");

?

Это я уже пробовал, запрос ничего не возвращает


-----
In Console We Trust. Code hard. Or die.
 
 Top
EuGen Администратор
Отправлено: 17 Апреля, 2012 - 17:44:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Верно, я имел ввиду - добавить поле. Не посмотрел на группировку. Вам верно указали, что предпочтительнее использовать WHERE вместо HAVING. Сделайте выборку date_format(`date`, '%H') отдельным полем.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Tox
Отправлено: 17 Апреля, 2012 - 18:28:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




Благодарю, все заработало.
Про having: не совсем понятно, как NOW()-INTERVAL 24 HOUR использовать для where. Через between?


-----
In Console We Trust. Code hard. Or die.
 
 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