按IP排序然后继续选择记录,直到我有3个唯一的IP

时间:2016-02-06 15:02:36

标签: mysql sql

我可能完全在考虑这个问题。

我的数据库中有一个报告表,它有一个IP列(varchar),一个数据列(INT)和一个Timestamp-column(TIMESTAMP)。

我必须编写一个查询,我按时间戳DESC排序,然后基本上保持从顶部选择记录,直到我的结果集包含至少3个唯一的IP,按顺序发生,直到遇到第4个IP。

例如:

IP         Data         Timestamp
1.1.1.0    0            1-1-2016
1.1.1.1    1            1-2-2016
1.1.1.1    2            1-3-2016
1.1.1.2    1            1-4-2016
1.1.1.3    1            1-5-2016
1.1.1.3    1            1-6-2016

在这种情况下,我想要一个结果集:

IP         Data         Timestamp
1.1.1.3    1            1-6-2016
1.1.1.3    1            1-5-2016
1.1.1.2    1            1-4-2016
1.1.1.1    2            1-3-2016
1.1.1.1    1            1-2-2016

仅针对用例:使用此数据的后端将对IP进行分组,生成数据列的平均值(基本上将1 + IP归为1),然后再进行处理。

我试过乱用GROUP BY,HAVING,Sub-query,我只是想不通它,虽然看起来很琐碎!

编辑:一些额外信息

SELECT DISTINCT ip
FROM report
ORDER BY timestamp DESC
LIMIT 3

不尊重首次出现的IP。例如,如果1.1.1.3在表中作为最后一次和第四次出现,那么DISTINCT将把应该排在最前面的IP作为第四个(意味着它从LIMIT 3中排除)。

然后我尝试了:

SELECT *
FROM report
WHERE ip in (
    SELECT DISTINCT ip
    FROM report
    ORDER BY timestamp DESC
)
ORDER BY timestamp DESC
LIMIT 3

这似乎有效,但也非常不优化...... LIMIT在IN中不起作用,MySQL拒绝这一点。当我使用LIMIT时,概述的问题就会发生。

2 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,以下查询应该会有效:

SELECT * 
FROM report
WHERE Timestamp >= (
    SELECT MIN(Timestamp) FROM (
        SELECT IP, MIN(Timestamp) as Timestamp
        FROM report
        GROUP BY IP
        ORDER BY Timestamp DESC
        LIMIT 3
    ) x
)
ORDER BY Timestamp DESC

可能有一些方法可以优化此查询,但我不知道您的方案中是否需要这样做。

请参阅this SQL Fiddle以便在实践中对其进行测试。

答案 1 :(得分:1)

怎么样

SELECT AVG(data), ip 
GROUP BY ip 
ORDER BY timestamp DESC
LIMIT 0,3

我的意思是在查询中执行下一个任务。为什么你要列出X个不同的ips,然后将它们分组,立即分组