【问题标题】:Mysql query using GROUP_CONCAT()使用 GROUP_CONCAT() 的 Mysql 查询
【发布时间】:2012-10-24 00:14:32
【问题描述】:

使用以下 mysql 查询:

SELECT DATE_FORMAT(time, '%Y-%m-%d') AS time,report,count(ip) AS countip FROM asn_data WHERE DATE_FORMAT(time, '%Y-%m-%d') > '2012-10-31' GROUP BY DATE_FORMAT(time,'%Y-%m-%d'),report;

我得到以下输出:

+------------+---------------+---------+
| time       | report        | countip |
+------------+---------------+---------+
| 2012-11-01 | bots          |      76 |
| 2012-11-01 | openresolvers |      97 |
| 2012-11-01 | proxy         |      24 |
| 2012-11-01 | scanners      |       4 |
| 2012-11-01 | spam          |     881 |
| 2012-11-02 | bots          |     142 |
| 2012-11-02 | proxy         |      22 |
| 2012-11-02 | spam          |     667 |
| 2012-11-03 | proxy         |       1 |
+------------+---------------+---------+

得到以下输出的查询是什么:

+------------+-------------+---------------+-------+----------+------+
| time       | bots        | openresolvers | Proxy | scanners | spam |
+------------+-------------+---------------+-------+----------+------+
| 2012-11-01 | 76          | 97            | 24    | 4        | 881  |
| 2012-11-02 | 142         | 0             | 22    | 0        | 667  |
| 2012-11-03 | 0           | 0             | 1     | 0        | 0    |
+------------+-------------+---------------+-------+----------+------+

【问题讨论】:

    标签: mysql group-concat


    【解决方案1】:

    这里不需要组concat,需要对结果集进行pivot,这样试试:

    SELECT DATE_FORMAT(time, '%Y-%m-%d') AS time,
    SUM(CASE WHEN report = 'bots' THEN ipc ELSE 0 END) AS bots,
    SUM(CASE WHEN report = 'openresolvers' THEN ipc ELSE 0 END) AS openresolvers,
    SUM(CASE WHEN report = 'Proxy' THEN ipc ELSE 0 END) AS Proxy,
    SUM(CASE WHEN report = 'scanners' THEN ipc ELSE 0 END) AS scanners,
    SUM(CASE WHEN report = 'spam' THEN ipc ELSE 0 END) AS spam
    FROM (
    SELECT count(ip) AS ipc, report, DATE(time) as time 
    FROM  asn_data 
    GROUP BY report, DATE(time)) i
    WHERE DATE_FORMAT(time, '%Y-%m-%d') > '2012-10-31'
    GROUP BY time;
    

    【讨论】:

    【解决方案2】:
    SELECT   DATE(time)                  AS time,
             SUM(report='bots'         ) AS bots,
             SUM(report='openresolvers') AS openresolvers,
             SUM(report='proxy'        ) AS Proxy,
             SUM(report='scanners'     ) AS scanners,
             SUM(report='spam'         ) AS spam
    FROM     asn_data
    WHERE    time > '2012-10-31'
    GROUP BY DATE(time)
    

    sqlfiddle 上查看。

    如果您希望排除 ip IS NULL 的记录,请将 AND ip IS NOT NULL 添加到每个 SUM() 函数中。

    【讨论】:

    • 修复了拼写错误(字段分隔符),如何确定表中不存在 ip 列?同样,您的答案与我的答案具有相同的逻辑,并且仅更改形式...
    • 如果ip字段为空?
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2011-04-28
    • 2014-01-14
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多