2014-11-22 147 views
-2

我想用连接查询2个表。我期望能获得2行,但只拿到1:为什么这只返回1行?

SELECT tmp.pk, tmp.domain, count(crawl.pk) 
FROM (
    SELECT * FROM domains 
    WHERE domain IN('www.google.com', 'www.yahoo.com') 
    AND pk < 10000 
) tmp 
JOIN crawl ON crawl.domain=tmp.pk 
AND crawl.date_crawled <= 3 
HAVING COUNT(crawl.pk) < 1000 

结果:

+-------+--------------------+-----------------+ 
| pk | domain    | count(crawl.pk) | 
+-------+--------------------+-----------------+ 
| 14929 | www.yahoo.com  |    88 | 
+-------+--------------------+-----------------+ 
1 row in set (0.03 sec) 

如果我从报表中删除 'www.yahoo.com' 然后我得到“www.google.com '(因此,我知道www.google.com和www.yahoo.com都通过了我的标准)。

为什么它只返回1行,当它应该返回2?

+2

没有看到数据就无法知道。 – doublesharp 2014-11-22 00:27:14

+4

你的GROUP BY语句在哪里? – Phil 2014-11-22 00:30:06

+0

@菲尔:非常棒。谢谢! – 2014-11-22 04:29:57

回答

1

不知道你为什么使用子查询。试试这个...

SELECT d.pk, d.domain, count(c.pk) 
FROM domains d 
INNER JOIN crawl c ON d.pk = c.domain 
WHERE d.pk < 10000 
AND d.domain in ('www.google.com', 'www.yahoo.com') 
AND c.date_crawled <= 3 
GROUP BY d.pk, d.domain 
HAVING COUNT(c.pk) < 1000 

如果您仍然有问题,我会尝试删除HAVING条款还有d.pk < 10000

1

因为tmp.pk是假设这没有意义小于10000,但您的示例记录集显示tmp.pk大于10000.

而且,您的连接看起来不正确。似乎你正试图加入一个数字字符串的字段。我特指:crawl.domain=tmp.pk

我建议你尝试通过tmp.domain加入。

另外,我会建议删除子查询和重构您的查询来代表更多@Phil在他的答案中建议的内容。

+1

关于pk过高的好处,但这应该是一个评论,而不是一个答案。我也冒险猜测'crawl.domain'实际上是'domain.pk的外键' – Phil 2014-11-22 00:38:27

+1

我明白你在说什么Phil,但考虑到两个表都包含'domain'和'pk'这两个表, - 根据他提出的查询,我觉得这是一个很有力的假设。 – 2014-11-22 00:43:53

+0

<10000在复制查询时是我的错误。好的建议。 Upvoted。 – 2014-11-22 04:26:48