Могу ли я использовать значение столбца в MySQL, ГДЕ ВЫБРАТЬ ИНТЕРВАЛ - PullRequest
0 голосов
/ 05 мая 2019

У меня есть система, которая проверяет веб-сайты на наличие определенных данных с заданной частотой. Каждый сайт имеет свою частоту проверки в столбце crawl_frequency. Это значение в днях.

У меня есть такая таблица

CREATE TABLE `websites` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `domain` VARCHAR(191) NOT NULL COLLATE 'utf8mb4_unicode_ci',
    `crawl_frequency` TINYINT(3) UNSIGNED NOT NULL DEFAULT '3',
    `last_crawled_start` TIMESTAMP NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)

Я хочу выполнить запросы, чтобы найти новые веб-сайты для проверки с указанной частотой / интервалом проверки. На данный момент у меня есть этот запрос, который отлично работает, если crawl_frequency для веб-сайта установлен на один день.

SELECT domain
FROM websites
WHERE last_crawled_start <= (now() - INTERVAL 1 DAY)
LIMIT 1

Есть ли способ в запросе MySQL, чтобы я мог использовать значение в столбце crawl_frequency для каждой строки в предложении WHERE.

Так, например, я хотел бы сделать что-то вроде:

SELECT domain
FROM websites
WHERE last_crawled_start <= (now() - INTERVAL {{INSERT VALUE OF CRAWL FREQUENCY FOR THIS PARTICULAR WEBSITE}} DAY)
LIMIT 1

Ответы [ 3 ]

2 голосов
/ 05 мая 2019

Вы можете попробовать использовать функцию DATEDIFF, например:

SELECT domain FROM websites
WHERE DATEDIFF(NOW(), last_crawled_start) > crawl_frequency
LIMIT 1;
2 голосов
/ 05 мая 2019

Вы можете сделать это так:

SELECT domain
FROM websites
WHERE last_crawled_start <= NOW() - INTERVAL crawl_frequency DAY
LIMIT 1

Да, действительно.

1 голос
/ 05 мая 2019

Все, что я прочитал для mysql, говорит, что оно не может быть переменным, но вы можете использовать другую функцию, например

SELECT * FROM websites 
WHERE 
  (unix_timestamp() - unix_timestamp(last_crawled_start))/86400.0 > crawl_frequency
...