因此标题可能有点混乱,但用几句话来描述问题很难。所以我现在有两张表很重要:
CREATE TABLE IF NOT EXISTS `private_crawler_urls` (
`id` int(11) NOT NULL,
`url` text NOT NULL,
`hash` varchar(47) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `private_crawler_url_checks` (
`id` int(11) NOT NULL,
`url_id` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`total_proxies` int(11) NOT NULL,
`working_proxies` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=latin1;
现在我想从private_crawler_urls
中选择所有网址,其中private_crawler_url_checks
中没有比给定Timespan更新的条目(例如10分钟)。这就是我现在所拥有的:
SELECT
u.id, u.url, c.created_at
FROM
private_crawler_urls u
INNER JOIN
private_crawler_url_checks c ON (c.url_id = u.id)
WHERE
c.created_at < NOW() - INTERVAL 10 MINUTE
ORDER BY c.created_at ASC
问题在于,由于我不想删除private_crawler_url_checks
中的旧条目,因此无法正常工作,因此总是会有一个超过SELECT x | y
FROM someTable
的条目给定的Timespan,即使表中有一个新的。
由于我对MySQL很陌生,我不知道如何实现这一点,所以我需要你的帮助。谢谢!如果您需要更多信息,请发表评论!
答案 0 :(得分:1)
我认为这会让你保留旧记录而不会干扰你的愿望。尽管如此,并不是所有关于性能影响的确定:
SELECT
pcu.url
FROM
private_crawler_urls as pcu
WHERE
pcu.id NOT IN (
SELECT
pcuc.url_id
FROM
private_crawler_url_checks as pcuc
WHERE
pcuc.created_at > DATE_SUB(NOW(), INTERVAL 10 MINUTE)
)
首先,它选择所有url_id
,其中最后10分钟内有created_at
。之后,它将选择url
不在此列表中的所有id