2017-02-08 3 views
0

У меня есть база данных mysql с данными моего клиента, я хочу показать часовые посещения, просмотры страниц в массиве. Я сделал ниже запрос mysql.Как получить часовые данные из mysql?

   <?php 
$siteid=$_GET["site"]; 

      $DB = mysqli_connect('localhost','username','password','databasename'); 
      $Q = "SELECT time, COUNT(*), pw FROM clientstats WHERE siteid='$siteid' AND time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 26970 SECOND)) GROUP BY HOUR(FROM_UNIXTIME(`time`)) ORDER BY time ASC"; 
      $R = mysqli_query($DB,$Q); 
      //start loop 
      //while or foreach 
      while($row = mysqli_fetch_assoc($R)){ 

date_default_timezone_set('Asia/Kolkata'); 
$timestamp = $row['time']; 
$timee = date('H', $timestamp); 
$times = $row['COUNT(*)']+$row['wh']; 


      echo ",['$timee', {$row['COUNT(*)']}, $times]\r\n"; 

      } 
      ?> 

, где 26970 секунд прошло с полуночи до настоящего времени. Этот код работает отлично и выводит массив как этот

,['02', 2, 3] ,['02', 1, 2] ,['04', 1, 2] ,['05', 1, 2] ,['06', 2, 3] 

Этой структура массива является [ «ЧАСА», посещение, PW], но проблема в том, что это не показывает значения для каждого часа непрерывно, как 1,2,3 , 4,5,6 .... и т. Д. Я хочу показывать значения за каждый час. Если значения для этих часов равны нулю, тогда я хочу вывести это значение часа как ['hour', 0, 0], Кроме того, в течение второго часа происходит удвоение в выводе. Как это исправить.

Пожалуйста, помогите мне, заранее.

ответ

0

Чтобы получить результат, полученный от MySQL, используя инструкцию SELECT, должен быть источник строки, который возвращает значения часов, которые «отсутствуют» из таблицы, из которой мы получаем счет.

(Получение этого результата из запроса - это только одна опция, мы можем поступить по-другому и сделать это на клиенте. Например, заполнив массив требуемыми часами, затем запустите исходный запрос и назначьте подсчитайте соответствующий соответствующий элемент массива. Этот ответ является демонстрацией того, как мы можем заставить MySQL вернуть указанный результат.)

В качестве одного из примеров того, как мы можем это сделать, вот запрос, который возвращает 24 строки целочисленных значений От 0 до 23. 23.

  SELECT 00 AS hr  UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 

Мы можем обернуть этот запрос в parens и указать, что вместо таблицы в другом qu чень.

SELECT i.hr 
    FROM (-- 0 thru 23 
     SELECT 00 AS hr  UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 
     ) i 
    ORDER BY i.hr 

Есть и другие способы вернуть набор целых чисел. Этот пример является всего лишь примером встроенного представления (производной таблицы), содержащегося в запросе. Это не зависит от каких-либо дополнительных таблиц в базе данных.

Если у нас есть таблица в базе данных, содержащая 24 строки с целыми значениями от 0 до 23, мы могли бы ссылаться на это вместо встроенного представления.

Мы также можем добавить предложение WHERE к внешнему запросу, чтобы исключить строки, которые имеют значение hr, позднее текущего часа.

И если мы хотим вернуть двухзначный час (с начальным нулем), мы можем использовать выражение в списке SELECT. Есть несколько выражений, которые сделают трюк.

SELECT RIGHT(CONCAT('0',i.hr),2) AS hh 
    FROM (-- 0 thru 23 
     SELECT 00 AS hr  UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 
     ) i 
    WHERE i.hr <= HOUR(NOW()) 
    ORDER BY i.hr 

Мы «сопоставляем» строки, возвращенные из этого, с подсчетами, возвращаемыми из исходного запроса. Мы можем использовать внешнюю операцию соединения, поэтому возвращаем строку в течение часа, когда нет соответствующей строки из запроса count.

Чтобы получить «пропавших без вести» Граф возвращается в ноль, мы выполняем условный тест, и заменить значение NULL с 0.

SELECT RIGHT(CONCAT('0',i.hr,2)) AS hh 
    , IFNULL(t.cnt,0) AS visits 
    , IFNULL(t.pw,0) AS pw 
    FROM (-- 0 thru 23 
     SELECT 00 AS hr UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03 
     UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07 
     UNION ALL SELECT 08 UNION ALL SELECT 09 UNION ALL SELECT 10 UNION ALL SELECT 11 
     UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 
     UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 
     ) i 
    LEFT 
    JOIN (-- counts by hour 
     SELECT HOUR(FROM_UNIXTIME(s.time)) AS hr 
       , COUNT(*) AS cnt 
       , MAX(s.pw) AS pw 
      FROM clientstats s 
      WHERE s.siteid = '$siteid' 
      AND s.time >= UNIX_TIMESTAMP(DATE(NOW())) 
      AND s.time < UNIX_TIMESTAMP(NOW()) 
      GROUP BY HOUR(FROM_UNIXTIME(s.time)) 
     ) t 
    ON t.hr = i.hr 
WHERE i.hr <= HOUR(NOW()) 
ORDER BY i.hr ASC 

Есть несколько различных запросов, которые возвращают указанное результат. Но трюк ...чтобы вернуть нулевой счет, нужно иметь источник строки, который возвращает возвращаемые значения часов, даже если эти значения часов не существуют в таблице, из которой мы получаем счет.

+0

Я попробовал этот запрос, но ничего не отображается? Можете ли вы объяснить больше. мой текущий точный запрос - это время SELECT, COUNT (*), wh FROM statxyx WHERE siteid = '$ siteid' AND time> UNIX_TIMESTAMP (DATE_SUB (NOW(), INTERVAL 26970 SECOND)) GROUP BY HOUR (FROM_UNIXTIME ('time')) ORDER BY время ASC – PARVINDER

Смежные вопросы