MySQL: получение результатов в одном временном интервале, но не в другом

0

Я создал набор данных, содержащий данные, охватывающие тридцать дней. 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;

Надеюсь, кто-то может помочь! Бен

  • 0
    Просто чтобы уточнить, вы хотите, чтобы жокеи были размещены только в последние два дня, и если они были размещены в какой-либо день до этого, они не отображаются в списке?
  • 0
    Ибо сейчас удаление WHERE race_venue = UNHEX(MD5('someplace')) изменит набор результатов? Кроме того, это можно переделать, используя объединения, а не подвыборы, которые могут сделать его немного быстрее / проще для понимания, но я опубликую информацию об этом позже.
Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

Если вы хотите сделать это по дате, а не через точную минуту и ​​секунду, вы можете изменить:

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

к чему-то вроде:

DATE(DATE_SUB(NOW(), INTERVAL 30 DAY))
  • 0
    Спасибо Скотт! Мне почти удалось добраться до ответа на вопрос при разговоре по сценарию с коллегой. Хотя я еще не нашел реализацию. Ура! Бен
0

Ну, в вашем 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 дней назад.

  • 0
    Извините - это не фактический код. Я сделал замену имен col перед отправкой кода. Проблема заключается в том, что NOW () означает NOW, а не ifxed временной интервал дня. Спасибо за Ваш ответ.
  • 0
    Смотрите исправление, это сделает это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню