2010-06-04 85 views
0

我已经生成了一个包含三十天数据的数据集。我试图缓解在过去2天内出现的新数据元素,但在此之前的28天内没有出现。MySQL:在一个时间范围内获取结果,但不在另一个时间范围内

  1. 我运行一个PHP脚本来生成测试数据。 (PHP和MYSQL在测试时返回同一时间)

  2. 我对它运行以下查询。

  3. 结果被确实地返回半小时左右。然后,尽管我相信有匹配的记录,但运行此查询时不会返回任何匹配记录。

是否有任何明显的错误我在SQL中会导致这种明显的“漂移”发生?

关于该数据:

脚本每天都会产生一个“种族”。它使用10个“jokeys”的排名填充排名表。为了进行测试,脚本会在前两天内生成两次新的'joke',前10天内剩余的30天内相同。

结果预计:

2个jokeys谁在比赛中最近排名(在过去的两天,在之前的28个排不上)的名称。

的SQL:

SELECT *, FROM_UNIXTIME(`race_timestamp`) as ts FROM `rankings` 
WHERE `race_venue` = UNHEX(MD5('someplace')) 
AND `jokey` IN 
    (
SELECT `jokey` 
FROM `rankings` 
WHERE `race_timestamp` 
BETWEEN # Get results for races between now and two days ago 
UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 2 DAY)) # timestamp two days ago 
AND 
UNIX_TIMESTAMP() # time stamp now 
    ) 
AND 
`jokey` NOT IN 
(SELECT `jokey` 
FROM `rankings` 
WHERE `race_timestamp` 
BETWEEN # Get results between 2 and 30 days ago 
UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) # time stamp 30 days ago 
AND 
UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 2 DAY)) # time stamp 2 days ago 
) 
GROUP BY jockey; 

希望有人能帮助!本

+0

为了澄清,你希望在过去的两天里**只**的骑师,如果他们在之前的任何一天放置,他们不会出现在列表中? – Joseph 2010-06-04 13:37:04

+0

现在确实删除'WHERE race_venue = UNHEX(MD5('someplace'))'更改结果集?除此之外,这可以使用连接而不是子选择来重做,这可能会使其更快/更易于理解,但我会在稍后发布信息。 – 2010-06-04 13:42:15

+0

您是否已对您生成的数据进行了视觉检查,以确保您获得的数据是正确的? – 2010-06-04 13:54:43

回答

1

如果你想按日期要做到这一点,而不是确切的分秒,你可能会改变:

UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) 

喜欢的东西:

DATE(DATE_SUB(NOW(), INTERVAL 30 DAY)) 
+0

谢谢Scott!当我与一位同事谈论这个场景时,我只是设法找到问题的答案。尽管如此,我还没有找到实施。 干杯! 本 – 2010-06-04 14:02:17

0

那么有一些小SQL中的错误。你在jokeyjockey之间切换我只是猜你是指骑师,因为这看起来与赛跑有关。不知道这是否在你的实际代码中,但如果它真的可能不会运行。此外,您没有理由使用GROUP BY jockey,因为没有使用聚合函数。

试试这个:

SELECT *, FROM_UNIXTIME(race_timestamp) AS ts FROM rankings 
WHERE 
    race_venue = UNHEX(MD5('someplace')) 
    AND jockey IN (
    SELECT jockey FROM rankings 
    WHERE race_timestamp 
     BETWEEN UNIX_TIMESTAMP(DATE_SUB(DATE(NOW()), INTERVAL 2 DAY)) 
     AND UNIX_TIMESTAMP() 
) 
    AND jockey NOT IN (
    SELECT jockey FROM rankings 
    WHERE race_timestamp 
     BETWEEN UNIX_TIMESTAMP(DATE_SUB(DATE(NOW()), INTERVAL 30 DAY)) 
     AND UNIX_TIMESTAMP(DATE_SUB(DATE(NOW()), INTERVAL 2 DAY)) 
) 

其他,没有实际的错误,我可以在你的逻辑检测。此查询应该返回所有在过去2天内排名并且没有在2-30天前排名的请求场地的骑师。

+0

对不起 - 这不是实际的代码。在提交代码之前,我确实提供了col的名字。问题是NOW()意味着NOW而不是一天的时间框架。 感谢您的回答。 – 2010-06-04 14:15:40

+0

看到修复,这将做到这一点。 – defines 2010-06-04 14:27:08

相关问题