非常复杂的Group By / Unique / Limit by SQL-command

时间:2010-10-22 14:54:27

标签: mysql grouping limiting

我实际上甚至不知道如何称呼它: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分钟,有时可能会少一分钟......)

3 个答案:

答案 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,具体取决于您的需要。