Я создал набор данных, содержащий данные, охватывающие тридцать дней. Im пытается вывести новые элементы данных, которые появились за последние 2 дня, но не в предыдущие 28 дней до этого.
Я запускаю PHP script, который генерирует тестовые данные. (PHP и MYSQL возвращаются в то же время при тестировании)
Я запускаю для него следующий запрос.
Результаты возвращаются аккуратно в течение получаса. Тогда, несмотря на то, что я считаю, что там должны быть сопоставленные записи, ни один из них не возвращается при запуске этого запроса.
Есть ли какая-то явная ошибка, которую я делаю в SQL, которая может вызвать этот очевидный "дрейф"?
О данных:
script генерирует "гонку" в день. Он заполняет ранговые таблицы ранжированием 10 'jokeys'. Для целей тестирования script генерирует гонки с предыдущих двух дней с двумя новыми "джокеями" в верхней части 10. Остальные 30 дней расы идентичны.
Ожидаемые результаты:
Имена двух шутников, которые недавно заняли место в гонке (за последние два дня и не занимали места в предыдущих 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;
Надеюсь, кто-то может помочь! Бен
Если вы хотите сделать это по дате, а не через точную минуту и секунду, вы можете изменить:
UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY))
к чему-то вроде:
DATE(DATE_SUB(NOW(), INTERVAL 30 DAY))
Ну, в вашем SQL есть небольшие ошибки. Вы переключаетесь между jokey
и jockey
. Я просто думаю, что вы имеете в виду жокея, поскольку это похоже на расовую связь. Не уверен, что это в вашем фактическом коде, но он, вероятно, не запускался вообще, если бы это было так. Кроме того, у вас нет причин использовать 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 дней назад.
WHERE race_venue = UNHEX(MD5('someplace'))
изменит набор результатов? Кроме того, это можно переделать, используя объединения, а не подвыборы, которые могут сделать его немного быстрее / проще для понимания, но я опубликую информацию об этом позже.