Почему файлы MySQL Group By Hours и Half Hours не отображают одни и те же данные? - PullRequest
0 голосов
/ 29 марта 2010

Мне нужно иметь возможность отображать данные, которые у меня есть, с шагом 15 минут на разных типах отображения. У меня есть два вопроса, которые доставляют мне неприятности. Один показывает данные за полчаса, другой показывает данные за час. Единственная проблема заключается в том, что итоговые данные меняются между запросами. Это не считая данных, которые происходят между таймфреймами, только в течение таймфреймов.

Ex: В 7:15 утра происходит 5 вещей. 2, которые происходят в 7:30 утра и 4, которые показывают в 7:00 утра.

15-минутный просмотр отображает все данные. В получасовом просмотре отображаются данные с 7:00 до 7:30, но игнорируется 7:15 .
На дисплее часов отображаются только данные за 7:00

Вот мои вопросы:

$query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start),floor(minute(start)/30)";

и

$query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start) ";

Как вытащить данные в группы, как у меня, но получить все данные в комплекте?

Проблема в том, как данные хранятся в таблице mysql? В настоящее время у меня есть столбец с датами (2010-03-29) и столбец с временами (00:00). Нужно ли конвертировать их во что-то еще?

Ответы [ 2 ]

3 голосов
/ 30 марта 2010

Вы неправильно интерпретируете «группу». Вы не «группируете» несколько записей, чтобы получить их все одним вызовом fetchrow(). В результате база данных объединит все записи, соответствующие групповым предложениям, в одну запись. Возьмите простую таблицу результатов игры:

id   playername  score
----------------------
1    John        23
2    Fred        12
3    Jack        9
4    John        18

Если вы выполнили следующий запрос: SELECT id, playername, score FROM table GROUP BY playername, вы получите следующий набор результатов:

id   playername  score
----------------------
1    John        23
2    Fred        12
3    Jack        9

Эй! Куда ушел Джон № 4? Он исчез, потому что строка с идентификатором # 4 соответствовала предложению GROUP BY и была свернута в первую найденную строку (# 1). Сам по себе не очень полезный, теперь вы потеряли все данные, связанные с идентификатором №4. Но именно здесь в игру вступают агрегатные функции (сумма, число, среднее и т. Д.): SELECT id, playername, SUM(score) FROM table GROUP BY playername:

id   playername  score
----------------------
1    John        41   <---notice the change (23 + 18 = 41)
2    Fred        12
3    Jack        9

С вашими запросами у вас есть два варианта:

  1. Оставьте GROUP BY как есть и выполните все необходимые вычисления для сгруппированных данных в запросе (суммирование, подсчет, усреднение и т. Д.), Чтобы получить агрегированные результаты для каждого из соответствующих периодов времени
  2. Удалите предложения GROUP BY, выполните любые вычисления в своем приложении
  3. Преобразование предложений GROUP BY в поля результатов в запросе, чтобы вы могли обрабатывать периоды в своем коде на основе этих новых столбцов: SELECT *, HOUR(start), FLOOR(MINUTE(start)/30) FROM data
1 голос
/ 30 марта 2010

GROUP BY неверна, и вы не используете агрегирующую функцию в своем запросе. Отбросьте GROUP BY, база данных теперь должна угадать, какие записи она должна выбрать. И базы данных не должны угадывать, они должны получить правильный ответ и только правильный ответ.

Измените РЕЖИМ SQL и создайте правильный запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...