0

这是我的loginsSQL 表:

id | user | time | ip

示例数据:

id | user | time       | ip
1    5      1352100506   80.87.208.133

我在这个表中已经有大约 50 000 行,所以我想过滤掉它。

我不想删除旧条目,而是保留其中一些。我想要:

1) 保留每个用户使用过的每个唯一 IP
2) 保留每个此类 IP 的最新(最大)时间

所以从这个数据集中:

id user time ip
1  1    1350000000 1.1.1.1
2  1    1350000001 1.1.1.1
3  1    1350000002 1.1.1.1
4  1    1350000003 1.1.1.2
5  1    1350000004 1.1.1.3

我想要这个选择/结果:

id user time ip
3  1    1350000002 1.1.1.1
4  1    1350000003 1.1.1.2
5  1    1350000004 1.1.1.3

这是我当前的查询,但我不确定我这样做是否正确:

SELECT `id`, `user`, MAX(`time`), `ip`
FROM `logins`
GROUP BY `user`, `ip`

为什么我认为查询不正确:

因为当我做这个测试查询时:

SELECT `id`, `user`, FROM_UNIXTIME(`time`), FROM_UNIXTIME(MAX(`time`)), `ip`
FROM `logins`
WHERE `user` = 1
GROUP BY `user`, `ip`

time和的值MAX(`time`)不同,但id值相同。这怎么可能?

这是我的 PMA 结果:

在此处输入图像描述

所以我想知道我的查询实际上返回了什么。它是否返回我想要的(每个用户的每个唯一 IP 只有一次,每个此类 IP 的最新时间)?

4

2 回答 2

1

尝试这样的事情:

SELECT l.`id`, x.`user`, x.`maxtime`, x.`ip` FROM 
    `logins` l,
    (SELECT `user`, MAX(`time`) as `maxtime`, `ip` FROM 
        `logins` GROUP BY `user`, `ip`) x 
    WHERE l.`user` = x.`user` AND l.`ip` = x.`ip` AND l.`time` = x.`maxtime`;

它与您的相似,但子查询的数量较少。

于 2013-10-17T14:46:00.203 回答
0

好的,我想我用以下方法解决了它,但是我确信有更好的方法:

SELECT `user`, MAX(`time`) as `maxtime`, `ip`,

(
    SELECT `id`
    FROM (SELECT * FROM `logins`) as `a`
    WHERE `a`.`user` = `logins`.`user`
    AND `a`.`ip` = `logins`.`ip`
    AND `a`.`time` = MAX(`logins`.`time`)
) as `id`

FROM `logins`
GROUP BY `user`, `ip`
于 2013-10-17T14:52:07.380 回答