2014-10-17 1055 views
1

我有一个数据库结构:MySQL分组两次

ip | yid |日期

其中ip代表用户的IP并且yid是特定页面ID。我正在尝试通过ipyid列进行分组,这一点我已在下面完成。但之后我需要将这些结果按yid分组。所以它会被分组到:

yid |计数

其中count是页面被调用的次数,每个ip地址限制1次调用。

现在我有:

SELECT `ip`, `yid`, `time`, MAX(`time`), count(*) 
FROM mp_downloads 
GROUP BY CONCAT(`ip`, `yid`), `yid` 
ORDER BY count(*) DESC 

但它不是由不同的yid & ip组合这组分组后的页面ID。

回答

1

试一试使用嵌套查询:

select temp.*, count(*) from 
(SELECT `ip`, `yid`, `time`, MAX(`time`) 
FROM mp_downloads 
GROUP BY CONCAT(`ip`, `yid`))temp group by temp.yid; 
+0

这个工程,但我不得不删除'ORDER BY count(*)DESC'。 – user1345650 2014-10-17 03:59:51

0

用于获取已访问的IP地址数的规范性图案(yid)将是:

SELECT d.yid 
    , COUNT(DISTINCT d.ip) AS ip_count 
    , MAX(d.date)   AS latest_time 
FROM mp_downloads d 
GROUP BY d.yid 

为了获得最佳性能,你会想要一个合适的索引,例如

... ON mp_downloads (yid, ip, date) 

没有必要通过连接两列的表达式进行分组。不需要派生表(内联视图)或子查询。如果您不需要latest_time,则可以省略该表达式。

+0

有没有办法在这个查询中获得'latest_time'的平均值? – user1345650 2014-10-17 04:18:37

+0

如果你的意思是你想为每个“(yid,ip)”设置“最新”时间,然后你想“平均”这些值,那就需要一个子查询(在SELECT列表中,或者作为内联视图),或者一些有关排序和用户定义变量的技巧。并且计算平均值的表达式将取决于“日期”列的数据类型。 (如果这个要求是规范的一部分,那么它应该包含在问题中,而不是作为对答案的评论。) – spencer7593 2014-10-17 04:40:19

+0

只是说,其他解决方案允许人们简单地将AVG(时间)查询。我只是想知道是否有一个简单的方法通过你的答案来做到这一点 – user1345650 2014-10-17 05:27:33