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. Tox - 17 Апреля, 2012 - 12:59:54 - перейти к сообщению
Таблица в бд имеет следующий вид: поле 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 массива (в бд данные есть!).
Что это за прикол, пожалуйста, объясните
2. Мелкий - 17 Апреля, 2012 - 13:21:03 - перейти к сообщению
0) phpfaq.ru/debug
1) смотрите сырой результат запроса
2) массив по представленному коду должен быть один и состоять из 2 элементов
3) крайне подозрительно смотрю на поле date, переопределяемое непонятно на что (именно непонятно на что, может использоваться любая строка) после группировки и потом по этому же значению отсекает having тех, кто ему не нравится. Что может привести и, видимо, приводит, к непредсказуемому результату выборки.

Не имеющие отношения к решению советы:
0) не используйте having там, где достаточно where, первый не использует индексы
1) использование now() ставит крест на кэше запросов, тогда как ваш запрос замечательно можно кэшировать
3. Tox - 17 Апреля, 2012 - 16:59:16 - перейти к сообщению
Спасибо, поменял запрос, сработало:
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?
4. EuGen - 17 Апреля, 2012 - 17:34:45 - перейти к сообщению
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;");

?
5. Tox - 17 Апреля, 2012 - 17:38:36 - перейти к сообщению
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;");

?

Это я уже пробовал, запрос ничего не возвращает
6. EuGen - 17 Апреля, 2012 - 17:44:00 - перейти к сообщению
Верно, я имел ввиду - добавить поле. Не посмотрел на группировку. Вам верно указали, что предпочтительнее использовать WHERE вместо HAVING. Сделайте выборку date_format(`date`, '%H') отдельным полем.
7. Tox - 17 Апреля, 2012 - 18:28:42 - перейти к сообщению
Благодарю, все заработало.
Про having: не совсем понятно, как NOW()-INTERVAL 24 HOUR использовать для where. Через between?

 

Powered by ExBB FM 1.0 RC1