Mysql 非常复杂的Group By/Unique/Limit By SQL命令

Mysql 非常复杂的Group By/Unique/Limit By SQL命令,mysql,grouping,limiting,Mysql,Grouping,Limiting,我甚至不知道怎么称呼这个:p,但是 我有一张桌子,我们称之为“上传” 现在,当我做一些类似的事情时: SELECT id FROM uploads ORDER BY date DESC 这将导致: id owner date ----------------------------- 6 foo 20100101120800 .. .. .. 3 bar 20100101120600 2 foo 2010010

我甚至不知道怎么称呼这个:p,但是

我有一张桌子,我们称之为“上传”

现在,当我做一些类似的事情时:

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
id    owner    date
-----------------------------
6     foo      20100101120800
3     bar      20100101120600
0     foo      20100101120000
问题:不错,但是,我想更进一步。因为现在,当你建立一个时间线(我做到了:P)时,你会收到“垃圾邮件”,说foo和bar上传了一些东西。我想对它们进行分组,并在date字段返回第一个时间限制为“500”的结果

我需要什么样的SQL命令才能产生:

id    owner    date
-----------------------------
6     foo      20100101120800
..    ..       ..
3     bar      20100101120600
2     foo      20100101120400
1     bar      20100101120300
0     foo      20100101120000
id    owner    date
-----------------------------
6     foo      20100101120800
3     bar      20100101120600
0     foo      20100101120000
然后,在这之后,我可以对每个记录执行一个调用,以在5分钟的时间范围内获取关联记录(这是一个id=6的exmaple):

现在有人知道我应该如何做第一步吗?(因此限制/分组结果)


(顺便说一句,我知道当我想使用它时,我应该将每个日期(YmdHis=60)转换为Unix时间(=100),但我不需要将5分钟精确地转换为5分钟,有时可能会少一分钟……

标准SQL不能很好地处理时间间隔。 您需要对表进行自连接,以比较不同元组的日期。 这样,您就可以很容易地找到日期间隔不超过500的所有元组对。 然而,您确实希望将日期聚集在间隔不超过500的集合中——据我所知,这根本不能用SQL表示


您可以做的事情非常类似:将总时间间隔拆分为固定的500个单位范围,然后根据它们所在的时间间隔对表中的所有元组进行聚类。为此,您首先需要一个带有间隔开始时间的表或查询结果;这可以使用表上的SQL查询和函数创建,该函数可以将时间戳“舍入”到其间隔中的开始时间,或者计算其间隔序列号。然后,作为第二步,您可以将该表与该结果连接起来,根据相应的开始时间对其时间戳进行分组。我不能给出SQL,因为它依赖于DBMS,我当然不能告诉您,在您的情况下,这是否是实现所需的最佳方法。

标准SQL不能很好地处理时间间隔。 您需要对表进行自连接,以比较不同元组的日期。 这样,您就可以很容易地找到日期间隔不超过500的所有元组对。 然而,您确实希望将日期聚集在间隔不超过500的集合中——据我所知,这根本不能用SQL表示


您可以做的事情非常类似:将总时间间隔拆分为固定的500个单位范围,然后根据它们所在的时间间隔对表中的所有元组进行聚类。为此,您首先需要一个带有间隔开始时间的表或查询结果;这可以使用表上的SQL查询和函数创建,该函数可以将时间戳“舍入”到其间隔中的开始时间,或者计算其间隔序列号。然后,作为第二步,您可以将该表与该结果连接起来,根据相应的开始时间对其时间戳进行分组。我不能给出SQL,因为它依赖于DBMS,我当然不能告诉您这是否是在您的情况下实现所需功能的最佳方法。

使用内联视图?e、 差不多

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分钟内返回所有发帖。

是否使用内联视图?e、 差不多

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分钟内返回所有帖子。

我不太清楚你想要得到的结果,即使有你的例子。也许是四舍五入和分组

SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner

你可能想用地板或天花板代替圆形,这取决于你想要什么。

我不太清楚你想要得到什么结果,即使有你的例子。也许是四舍五入和分组

SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
FROM uploads GROUP BY date_interval,owner

根据您的需要,您可能希望使用地板或天花板而不是圆形。

这正是我的意思。我现在使用的是“按轮从上传组中选择id(UNIX\u TIMESTAMP(date)/3600),所有者”。我使用3600,因为我认为在我尝试了两种方法后1小时比5分钟好。在Reinierpost提到“interval”之后,我开始在Google上搜索“MySQLgroupbyInterval”,我发现:,这非常有用!无论如何,非常感谢Reinierpost、Symcbean和Brent!这正是我的意思。我现在使用的是“按轮从上传组中选择id(UNIX\u TIMESTAMP(date)/3600),所有者”。我使用3600,因为我认为在我尝试了两种方法后1小时比5分钟好。在Reinierpost提到“interval”之后,我开始在Google上搜索“MySQLgroupbyInterval”,我发现:,这非常有用!无论如何,非常感谢Reinierpost、Symcbean和Brent!