我正在尝试使用连接查询2个表。我希望得到2行但只得到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)
如果我删除&#39; www.yahoo.com&#39;从IN声明然后我得到www.google.com&#39;在结果中(因此,我知道www.google.com和www.yahoo.com都通过了我的标准)。
为什么它只返回1行,应该返回2?
答案 0 :(得分: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 :(得分:1)
这没有意义,因为tmp.pk假设小于10000,但你的示例记录集显示tmp.pk大于10000。
并且,您的加入看起来不正确。似乎您正在尝试使用数字字段加入基于字符串的字段。我具体指的是:crawl.domain=tmp.pk
我建议您尝试通过tmp.domain加入。
或者,我建议删除子查询并重构您的查询以代表@Phil在其答案中建议的更多内容。