首页 > 解决方案 > 计算 A 列中的不同值,按 B 列分组

问题描述

我有一个 MySQL 表,每一行代表一个在 php 中发出的 curl 请求。使用列名(ip、http_code、time_checked)

SELECT * 
FROM proxy_stastistics 
WHERE time_checked > UNIX_TIMESTAMP( NOW() - INTERVAL 24 HOUR )

我目前使用上述查询仅返回过去 24 小时内创建的记录,但我希望每个唯一 IP 地址仅返回一行,但当时创建 2 个附加列,其中任何 http_code = 200 或 http_code = 0 作为增量列。

所以我会得到这样的东西

IP          | 200 | 0 | 404
192.168.0.1 | 100 | 5 | 1
192.168.0.2 | 84  | 3 | 0

在阅读 MySql 数据透视表后进行编辑,我能够创建以下查询来实现我想要做的事情。

SELECT ip_address, 
       SUM(http_code = '200') AS http200, 
       SUM(http_code = '0')   AS http0, 
       SUM(http_code = '404') AS http404 
FROM   proxy_stastistics 
WHERE  time_checked > Unix_timestamp(Now() - interval 24 hour) 
GROUP  BY ip_address 

标签: mysqlpivot

解决方案


如果我理解正确,你需要这样的东西:

select  ip, 
        sum(if(http_code=200,1,0)) code200 , 
        sum(if(http_code=0,1,0)) code0,  
        sum(if(http_code=404,1,0)) code404 
from proxy_stastistics
where time_checked > UNIX_TIMESTAMP( NOW() - INTERVAL 24 HOUR )
group by ip

你可以在这里看到工作小提琴:

http://sqlfiddle.com/#!9/35df03/8


推荐阅读