因此标题可能有些混乱,但是很难用几句话来描述问题。因此,我现在有两个重要的表:

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/

10-14 13:48
查看更多