按值连接多维数组

时间:2012-11-16 11:53:56

标签: php mysql multidimensional-array

嗨我有一个小问题,我查询mysql并检索数据列表到json编码并绘制成图形(例如数量与日期轴)。但是,如果没有数据,sql没有返回查询数据的日期。所以图表上缺少日期。

我在这里读过一些人为了填补空白而创建其他表格的工作。这对我来说不是一个选择。

我有一个解决方案,可以在查询中创建所有日期的数组。

有人可以建议将这种方法压缩到我的多维查询结果数组中。希望通过某种方式聪明的预言。

或者是否有一个我不确定的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;

所以已经非常混乱了。

1 个答案:

答案 0 :(得分:0)

您可以使用MySQL中的比较结果是一个数字来简化您的SQL查询; 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时间。所以除了第一秒之外,你不会包括那一天。你可能需要这样做。

关于如何组合事物的实际问题:上述查询按升序生成日期。因此,请记下日期列表,并查看该列表中的第一项是否等于下一条记录的日期。虽然情况并非如此,但在结果数据中插入一行零,并继续列表中的下一个日期,保持查询中的当前记录不变。

相关问题