2012-07-12 58 views
0

如何从今天开始计算,每7天选择一个,最近的NID,从UID开始计算。按多列和时间跨度对MYSQL结果进行分组

如果今天是7月11日见下表

+-----+------------+-----+ 
| NID | timestamp | UID | 
+-----+------------+-----+ 
| 1 | 1341719851 | 8 | //July 7 
| 2 | 1341115051 | 8 | //July 1 
| 3 | 1341547051 | 8 | //July 6 
| 4 | 1341719851 | 8 | //July 8 
| 5 | 1341979051 | 8 | //July 11 
| 6 | 1341806251 | 9 | //July 9 
| 7 | 1341460651 | 9 | //July 5 
| 8 | 1341892651 | 9 | //July 10 
+-----+------------+-----+ 

将输出这样的:

+-----+------------+-----+ 
| NID | timestamp | UID | 
+-----+------------+-----+ 
| 2 | 1341115051 | 8 | //July 1 
| 5 | 1341979051 | 8 | //July 11 
| 8 | 1341892651 | 9 | //July 10 
+-----+------------+-----+ 

在过去7天,最近NID为每个用户是'5''8',在前7天,最近的NID'2',依此类推......

我假设, Group By将会诀窍;但我不知道从哪里开始。

UPDATE

这是工作的查询的基础上,最多的回答:

SELECT nid, timestamp, uid, weeks_ago 
FROM (
    SELECT nid, timestamp, uid, FLOOR(
     (UNIX_TIMESTAMP()- timestamp)/604800 
    ) weeks_ago 
    FROM `table` 
    ORDER BY timestamp DESC 
) x 
GROUP BY uid, weeks_ago 
+0

'timestamp'列是MySQL'TIMESTAMP'数据类型吗? 这是*滚动* 7天或7天=一周?你想要所有的结果还是仅仅在前7天? – 2012-07-12 04:32:44

+0

这是一个Unix时间戳......我不知道我是否理解你的权利。这是滚动7天,即从今天0-7天,从今天起8-14天,15-21 ...我需要所有结果,而不仅仅是前7天。 – timofey 2012-07-12 04:54:12

回答

3
select nid, max(timestamp), uid, weeks_ago 
from (select nid, timestamp, uid, floor(datediff(now(), from_unixtime(timestamp))/7) weeks_ago 
     from mytable) x 
group by nid, uid, weeks_ago 
+0

几乎在那里。它输出所有列,不按每个uid的weeks_ago分组。 – timofey 2012-07-12 05:19:30

+0

对这个答案进行了一些调整(查看我的更新,上面),查询工作!谢谢! – timofey 2012-07-12 06:05:25

0
select * from (
    (
     select nid, uid,timestamp,floor(datediff(now(), from_unixtime(timestamp))/7) as weeks,from_unixtime(timestamp) as Dt from test t1 order by dt desc limit 0,2) 
Union 
    (
    select nid, uid,timestamp, 
    floor(datediff(now(), from_unixtime(timestamp))/7) as weeks,from_unixtime(timestamp) as Dt 
from test t2 group by weeks having weeks>0 order by dt asc limit 0,1 
    ) 
    ) t4 

可能是这样解决您的问题。试试这个