2014-11-22 202 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