2012-08-10 24 views
0

我想根据表的行中的日期从我的MySQL表中获取前N个星期的数据。基于内容中的日期获取N个最后几周的MySQL行

试想一下,当前周是30号,我有29周​​,28,26和12

如果我要根据今天的日期过去两周行的数据行,这很容易,但我希望基于行上的时间戳。因此,如果N = 2,我希望从第29周和第28周开始的所有行。如果N = 3,我希望第29,28和26周,无论哪一周是我提取它的时间。

我可以使用PHP和基于估计输出的猜测来做到这一点,但也许有一些我可以利用的MySQL功能。

+0

喜欢的东西SELECT .... WHERE时间>值1和时间<值 – thatidiotguy 2012-08-10 20:44:42

+0

使用MySQL的LIMIT选择您需要的范围。 – j08691 2012-08-10 20:45:09

+0

因此,您实际上需要最后N个数据(恰好在几周内),而不是最后N个星期的数据? – 2012-08-10 20:58:05

回答

2

一种方法是使用查询获取想要返回的周数,然后将该查询用作可以加入的内联视图。

事情是这样的:

SELECT t.* 
    FROM (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r 
    JOIN tab t 
    ON t.week = r.week 

内联视图(别名为r)获取表中的N个最近一周值的列表。 (假设周列是可排序的,就像它是一个整数一样)

将它加入到表中,ON子句将从表返回的行限制为具有星期值的那些行该匹配一个由联视图返回

注意:week列的索引可用于大量的行的,并在week柱高基数提供显著性能益处

注:对于大表,可能会有性能差异例如,执行JOIN操作与使用IN (subquery)谓词,如下例所示。对于大多数大集合以及我所做的查询,我发现JOIN通常表现更好。但是你可能想要测试两者,看看哪个更适合你。 (小表,它不会多大关系无论哪种方式,性能差异成为真正的大表显著。)

SELECT t.* 
    FROM tab t 
WHERE t.week 
    IN (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r 
1

尝试这样的事情(代码未测试):

SELECT ... FROM table WHERE week IN (
    SELECT DISTINCT week FROM table ORDER BY weeks DESC LIMIT 3 
) 

基本上,只要使用DISTINCT关键字,以得到实际是在数据库中的数周的列表,然后用ORDER BY ... DESC LIMIT 3拿到三最近几周。

我在一个子查询中这样做,这样你就可以在PHP中使用它作为一个调用,而不是调用数据库,在PHP中解析,然后重新提交,而MySQL通常会以更快的速度执行。

相关问题