2016-07-18 7 views
0

タイトルはちょっと混乱するかもしれませんが、問題をほんの数ワードで説明するのは難しいです。別のテーブルのエントリに基づいてテーブルのデータを照会してください

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; 

は今、私は与えられたタイムスパン(例えば10分)よりも新しいprivate_crawler_url_checksにエントリがありませんprivate_crawler_urlsからすべてのURLを選択します:だから私は今、重要な2つのテーブルを持っています。それは私が今持っているものです。

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に古いエントリを削除したくないとして、これは働くことができないということですので、たとえ与えられたタイムスパンよりも古いのエントリが常にありますテーブルに新鮮なものがあります。 私はMySQLをかなり使い慣れているので、これをどのように達成できるか考えていないので、私はあなたの助けが必要です。ありがとう!より多くの情報が必要な場合は、コメントを残してください!

+0

いくつかのサンプルデータに基づいて表示してください。 – 1000111

答えて

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あり:ただし、パフォーマンスへの影響についてのすべてが一定ではありません。その後、 idがこのリストに含まれていないがすべて選択されます

関連する問題