2012-11-16 3 views
0

Привет, У меня есть небольшая проблема, когда я запрашиваю mysql и извлекаю список данных для кодирования json и построения графика в граф (например, количество против оси даты). Однако sql по праву не возвращает даты данных запроса, где нет данных. и поэтому на графике отсутствуют даты.Объединение многомерных массивов по значениям

Я читал здесь, что некоторые люди занимаются созданием других столов просто для заполнения пробелов. Это не вариант для меня.

У меня есть решение, которое создает массив всех дат в запросе.

Может ли кто-нибудь предложить средство для этого в моем многомерном массиве результатов запроса. надеюсь, некоторыми средствами умного foreach.

Или есть функция SQL, я не уверен, что может заполнить пустые даты?

мой запрос в настоящее время выглядит следующим образом:

SELECT SQL_CALC_FOUND_ROWS Date, SUM(call_answer) AS call_answer, SUM(call_busy) AS call_busy, SUM(call_noanswer) AS call_noanswer, SUM(call_notrec) as call_notrec 
    FROM ( 
     SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, COUNT(id) as call_answer, 0 as call_busy, 0 as call_noanswer, 0 as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND dialStatus = 'NORMAL_CLEARING' GROUP BY Date) 
      AS t_0 
      UNION 
      SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, COUNT(id) as call_busy, 0 as call_noanswer, 0 as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND dialStatus = 'USER_BUSY' GROUP BY Date) 
      AS t_1 
      UNION 
      SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, COUNT(id) as call_noanswer, 0 as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND (dialStatus = 'ORIGINATOR_CANCEL' OR dialStatus = 'NO_USER_RESPONSE') GROUP BY Date) 
      AS t_2 
      UNION 
      SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, 0 as call_noanswer, COUNT(id) as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND (dialStatus = 'UNALLOCATED_NUMBER' OR dialStatus = 'INVALID_NUMBER_FORMAT') GROUP BY Date) 
      AS t_3 

    ) 

    AS t_total 
    GROUP BY Date; 

Так уже довольно грязно.

ответ

0

Вы можете упростить свой SQL-запрос, используя тот факт, что результатом сравнения в MySQL является число; 0 для false и 1 для true. Таким образом, вы можете суммировать сравнения, чтобы вычислить ваши счета.

SELECT DATE(dateCreated) AS `Date`, 
SUM(dialStatus = 'NORMAL_CLEARING') AS call_answer, 
SUM(dialStatus = 'USER_BUSY') AS call_busy, 
SUM(dialStatus = 'ORIGINATOR_CANCEL') AS call_noanswer, 
SUM(dialStatus = 'UNALLOCATED_NUMBER') AS call_notrec 
FROM cdr 
WHERE company = '8346767432431' 
    AND dateCreated BETWEEN '2012-10-16' AND '2012-11-16' -- = 11-16 0:00 ! 
GROUP BY DATE(dateCreated) ASC 

Обратите внимание, что в конце своего диапазона, как в запросе и в вашей исходной, будет неявным предположить время из 0:00. Поэтому вы не включите этот день, за исключением самой первой секунды. Возможно, вам нужно будет это сделать.

Что касается актуального вопроса о том, как объединить вещи: вышеупомянутый запрос генерирует даты в порядке возрастания. Поэтому возьмите свой список дат и посмотрите, соответствует ли первый элемент в этом списке дате следующей записи. Хотя это не так, вставьте строку нулей в данные результата и продолжайте следующую дату из списка, сохраняя текущую запись из запроса нетронутой.

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