获取行之间具有固定值差异的行并减少连续日期

时间:2012-03-18 14:58:26

标签: php mysql

我桌子的结构:ID(int) | NUMBER(int) | CREATED_AT(date)

如果我有三个数字:10119,我是否可以获得表中所有行的NUMBER值相同且连续减少{{} 1}}约会?

示例:

如果我的号码是:10,11,9 ......行可能是:

CREATED_AT

结果必须为“50”

如果我的号码是:50,40,60 ......行可能是:

NUMBER | CREATED_AT
50     | 2012-03-18
51     | 2012-03-17
49     | 2012-03-16

结果必须为“100”

...

我浪费了半天的时间,但我仍然不知道从哪里开始...

P.S:我的桌子上有大约5000行。

更新

我用一些PHP代码和很多mysql查询做到了。脚本执行时间:~6秒。 [经过godaddy豪华主持测试] =)

2 个答案:

答案 0 :(得分:1)

我自己没有测试过,但你可以尝试一下:

SELECT a.*,b.*,c.*
FROM table_name a
INNER JOIN table_name b 
ON b.NUMBER = a.NUMBER + $range1 and DATEDIFF(b.CREATED_AT, a.CREATED_AT) = 1
INNER JOIN table_name c 
ON c.NUMBER = b.NUMBER + $range2 and DATEDIFF(c.CREATED_AT, b.CREATED_AT) = 1

$range1$range2是变量number1 - number2和number2 - number3。

答案 1 :(得分:1)

在你的例子中你有10,11和9.所以,如果t1.number = 10,那么t2.number = t1.number + 1和t3.number = t2.number - 2.这可以写成一个以这种形式查询 -

SELECT t1.NUMBER
FROM (SELECT 50 AS `first`, 40 AS `second`, 60 AS `third`) AS  seq
INNER JOIN `table` t1
    ON `seq`.`first` <> t1.NUMBER
INNER JOIN `table` t2
    ON `seq`.`second` <> t2.NUMBER
    AND t1.CREATED_AT - INTERVAL 1 DAY = t2.CREATED_AT
    AND CAST(t1.NUMBER AS SIGNED) - CAST(t2.NUMBER AS SIGNED) = `seq`.`first` - `seq`.`second`
INNER JOIN `table` t3
    ON `seq`.`third` <> t3.NUMBER
    AND t2.CREATED_AT - INTERVAL 1 DAY = t3.CREATED_AT
    AND CAST(t2.NUMBER AS SIGNED) - CAST(t3.NUMBER AS SIGNED) = `seq`.`second` - `seq`.`third`;

编辑 - 添加了CAST来处理否定

由于连接标准,这不是很有效,但是如果这么小的数据集应该没问题。