2014-01-18 3 views
0

Я пытаюсь построить граф данных, возвращенный из MySQL, используя фреймворк Highcharts. Ниже приведен запрос и функции форматирования:Группа DATE_FORMAT в SQL и группе возврата Unix Timestamps

function correlate_created_at_with_msg_vol($q, $time = NULL) { 
     global $db; 
     date_default_timezone_set('America/Chicago'); 

     $q = mysqli_real_escape_string($db, $q); 

     $query = "SELECT unix_timestamp(created_at) AS date,"; 
     $query .= " COUNT(tweet_id) AS count FROM `tweets`"; 
     $query .= " WHERE tweet_text LIKE '%{$q}%'" ; 
     $query .= " GROUP BY created_at"; 
     $query .= " LIMIT 20"; 
     $tweets = mysqli_query($db, $query); 
     confirm_query($tweets); 
     return $tweets; 
    } 

    function format_data($q) { 
     $msg_vol = correlate_created_at_with_msg_vol($q); 

     while ($tweet = mysqli_fetch_array($msg_vol, MYSQL_ASSOC)) { 
     # had ot modify correlate_created_at_with_msg_vol() 
     # to no longer use unix timestamps 
     $date = $tweet['date'] * 1000; 
     $count = intval($tweet['count']); 
     $formatted[] = array($date, $count); 
     } 
     return $formatted; 
    } 

в $ дата умножается на 1000 (в документации Highchart), чтобы изменить метку времени UNIX в миллисекундах, так как ЭПОХИ. Однако это нарушает мою часть моего запроса, поскольку они больше не сгруппированы до минуты. Как я могу настроить свой запрос так, чтобы все записи, которые произошли за минутный интервал, по-прежнему группировались во время временных меток unix?

Должен ли я сделать преобразование после SQL-запроса с помощью strtotime? Я все еще участвую, но я предполагаю, что это будет решение; к сожалению, из того, что я понимаю, выполнение процесса на стороне БД лучше для производительности. Не стесняйтесь исправить меня, если я ошибаюсь.

Я бы предпочел, чтобы БД выполняла DATE_FORMAT (created_at, '% Y-% m-% d% l:% i% p') и возвращала это с помощью строки, но так как мне нужна временная метка unix I не может найти способ сделать это.

Я открыт для любых предложений/отзывов/идей/критики. Спасибо.

P.S. Я планирую отказаться от mysqli в пользу PDO ... После того, как я заработаю этот проклятый график. ;)

ответ

1

Попробуйте это:

SELECT floor(unix_timestamp(created_at)/60)*60 AS date, 
     COUNT(tweet_id) AS count 
FROM `tweets` 
WHERE tweet_text LIKE '%{$q}%' 
GROUP BY date 

Это округляет каждую метку времени вплоть до начала минуты.

+0

Barmar, вы спасатель жизни! Большое вам спасибо, поскольку я сделал именно то, что я надеялся выполнить. – DroBuddy

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