2010-06-04 341 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

相關問題