因此标题可能有些混乱,但是很难用几句话来描述问题。因此,我现在有两个重要的表:
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
中选择所有URL,其中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
中的旧条目,因此即使表中有一个新条目,也总是存在比给定Timespan更旧的条目。由于我刚接触MySQL,所以我不知道如何完成此操作,因此需要您的帮助。谢谢!如果您需要更多信息,请发表评论!
最佳答案
我认为这将使您保留旧记录,而不会干扰您的愿望。但是,关于性能影响的不确定性尚不确定:
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
不在此列表中关于mysql - 根据另一个表中的条目从表中查询数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38439098/