-1

谁能告诉我如何编写以下 SQL:

SELECT url_source_wp.url 
FROM url_source_wp 
WHERE url_source_wp.id NOT IN (
  SELECT url_done_wp.url_source_wp
  FROM url_done_wp 
  WHERE (url_done_wp.url_group = 4) AND (hash IS NULL)) LIMIT 50;

使用连接?

我试过了:

SELECT url_source_wp.url 
FROM url_source_wp 
LEFT OUTER JOIN url_done_wp ON url_source_wp.id = url_done_wp.url_source_wp
WHERE url_done_wp.url_group = 4 AND url_source_wp.hash is NULL LIMIT 50

但回复不一样。

问题是第一个 SQL 非常非常慢。

4

2 回答 2

3

我相信你正在寻找这样的东西:

SELECT url_source_wp.url 
FROM url_source_wp 
LEFT OUTER JOIN url_done_wp
    ON url_source_wp.id = url_done_wp.url_source_wp AND url_done_wp.url_group = 4 AND hash IS NULL
WHERE url_done_wp.url_source_wp IS NULL
LIMIT 50
于 2013-04-18T21:31:21.683 回答
0

您不应该直接否定 WHERE 子句中的两个条件吗?

我假设您正在尝试获取所有 url_source_wp 记录,其 id 在 url_done_wp 表中由 FK url_source_wp 引用,这些记录不具有 url_group = 4 并且它们的哈希列不为空,因为您使用了带有 NOT IN 的子查询。INNER JOIN 应该没问题。

所以应该是:

SELECT url_source_wp.url 
FROM url_source_wp 
INNER JOIN url_done_wp ON url_source_wp.id = url_done_wp.url_source_wp
WHERE url_done_wp.url_group != 4 AND url_source_wp.hash IS NOT NULL LIMIT 50
于 2013-04-18T21:39:15.040 回答