我可能完全在考虑这个问题。
我的数据库中有一个报告表,它有一个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时,概述的问题就会发生。
答案 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,然后将它们分组,立即分组