我实际上甚至不知道如何称呼它:P,但是......
我有一张桌子,我们称之为“上传”
id owner date
-----------------------------
0 foo 20100101120000
1 bar 20100101120300
2 foo 20100101120400
3 bar 20100101120600
.. .. ..
6 foo 20100101120800
现在,当我做的事情如下:
SELECT id FROM uploads ORDER BY date DESC
这将导致:
id owner date
-----------------------------
6 foo 20100101120800
.. .. ..
3 bar 20100101120600
2 foo 20100101120400
1 bar 20100101120300
0 foo 20100101120000
问题:很好,但是,我想更进一步。因为现在,当你构建一个时间轴(我做了:P)时,你会被foo和bar上传内容的消息“垃圾邮件”。我想把它们分组并在日期字段中返回第一个结果,时间限制为'500'。
我需要什么样的SQL命令才能产生:
id owner date
-----------------------------
6 foo 20100101120800
3 bar 20100101120600
0 foo 20100101120000
然后,在那之后,我可以为每条记录执行调用,以便在5分钟的时间范围内获取关联记录(这是id = 6的例子):
SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC
现在有人应该怎么做第一步吗? (因此限制/分组结果)
(顺便说一下。我知道当我想使用它时,我应该将每个日期(YmdHis = 60)转换为Unix时间(= 100),但我不需要 5分钟正好是5分钟,有时可能会少一分钟......)
答案 0 :(得分:1)
标准SQL不能很好地处理间隔。 您将需要对表进行自联接以比较不同元组的日期。 这样,您可以轻松找到日期不超过500的所有元组对。 但是,你真的希望将日期分成不超过500的集合 - 据我所知,这根本不能用SQL表示。
你可以做的是非常相似:将总时间间隔分成固定的500个单位范围,然后根据它们所处的间隔对表中的所有元组进行聚类。为此,首先需要一个表格或查询结果与间隔的开始时间;这可以使用表上的SQL查询和一个函数来创建,该函数可以将时间戳“舍入”到其间隔中的开始时间,也可以计算其间隔序列号。然后,作为第二步,您可以使用该结果加入表,以根据相应的开始时间对其时间戳进行分组。我不能给SQL,因为它依赖于DBMS,我当然不能告诉你这是否是在你的情况下完成你想要的最好方法。
答案 1 :(得分:1)
使用内嵌视图?例如
之类的东西SELECT u1.*
FROM uploads u1,
(SELECT date
FROM uploads u2
WHERE u2.owner='foo') datum_points
WHERE u1.date BETWEEN datum_points.date
AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES)
应该在'foo'发帖后的5分钟内返回所有帖子。
答案 2 :(得分:1)
即使你的例子,我也不太清楚你想要得到的结果。也许是四舍五入和分组的东西。
SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner
您可能需要使用FLOOR或CEILING而不是ROUND,具体取决于您的需要。