从mysql表中获取每个ip的计数和总和

时间:2014-09-10 15:55:42

标签: mysql

我一直在研究从一个表生成IP ADDRESS REPORT并插入到另一个表但尚未成功或找到允许我这样做的资源。

我的IP表包含许多重复的ip,并希望分钟和计数(名称)的总和(分钟)每个不同的ip

ip                  name    minutes
199.199.199.199     nick    23
199.199.199.200     nick    3
199.199.199.200     bob     34
199.199.199.201     bob     56
199.199.199.201     sue     12
199.199.199.202     sue     45
199.199.199.202     helen   65
199.199.199.202     helen   15

我目前的方法如下

SELECT DISTINCT(distinct) as ip FROM `ip.ip_stats`;

在我的PHP中,我将每个不同的ip addreses添加到一个数组

$arr = array("199.199.199.199","199.199.199.200","199.199.199.201","199.199.199.202");

生成数组后,我会遍历数组中的每一个

foreach($arr as $ip){
     SQL ="SELECT COUNT(name) as cnt, SUM(minutes) as sum FROM `ip.ip_stats` WHERE ip='$ip'";
     $result = mysqli_query($con, $query);

     while ($row = mysqli_fetch_assoc($result)) {
          mysqli_query($con, "INSERT INTO ip.ip_report ( ip, count, sum )   
          VALUES ( $ip, $cnt, $sum ) 
     }
}

因此,在得到数组中每个ip的总和和数后,然后循环并插入到报告表中。

我的主要问题是它的大小和运行时间,我有超过一千万行数据,每分钟只有3-5次(大表那么我的例子)。

有没有办法使用mysql来选择distinct并生成报告? 有没有办法实现以下查询?使用循环或while?

SELECT SUM(minutes), COUNT(name) FROM ( SELECT DISTINCT(ip) FROM ip.ip_stats) ?

2 个答案:

答案 0 :(得分:0)

我相信你是在追求:

SELECT s.ip, s.name, SUM(s.minutes) AS TotalMinutes, COUNT(s.name) AS NameCount
FROM ip_stats s
GROUP BY s.ip, s.name

答案 1 :(得分:0)

SELECT
    ip,
    COUNT(name) as cnt,
    SUM(minutes) as sum
FROM `ip.ip_stats`
GROUP BY ip
;