MySQL分组两次

MySQL分组两次,mysql,Mysql,我的数据库结构为: ip | yid |日期 其中,ip表示用户的ip,yid是一个特定的页面ID。我正在尝试按ip和yid列进行分组,我在下面做了这些。但是我需要按照yid对这些结果进行分组。因此,它将其分为: yid |计数 其中count是页面被调用的次数,每个ip地址限制1次调用 现在我有: SELECT `ip`, `yid`, `time`, MAX(`time`), count(*) FROM mp_downloads GROUP BY CONCAT(`ip`, `yid`),

我的数据库结构为:

ip | yid |日期

其中,
ip
表示用户的ip,
yid
是一个特定的页面ID。我正在尝试按
ip
yid
列进行分组,我在下面做了这些。但是我需要按照
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进行分组。

使用嵌套查询尝试以下操作:

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

获取已访问(
yid
)的ip地址计数的标准模式是:

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)

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

在该查询中是否有方法获得
最新时间的平均值
?如果您的意思是希望每个
(yid,ip)
的“最新”时间,然后要“平均”这些值,则需要一个子查询(在选择列表中,或作为内联视图),或使用排序和用户定义变量的一些技巧。计算平均值的表达式将取决于
日期
列的数据类型。(如果此要求是规范的一部分,则应包含在问题中,而不是作为对答案的注释。)尽管如此,其他解决方案只允许将AVG(时间)添加到子查询中