2014-11-22 4 views
-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) 

나는 '내가 얻을 다음 IN 문에서'www.yahoo.com '을 제거하는 경우 www.google.com 나는 2 개 행을 얻을 수 있지만 1을 얻을 것으로 예상 '결과 (그러므로, www.google.com 및 www.yahoo.com이 모두 내 기준을 충족 함을 알고 있습니다).

2를 반환해야하는 이유는 1 행만 반환하는 이유는 무엇입니까?

+2

데이터를 보지 않고도 알 수있는 방법이 없습니다. – doublesharp

+4

당신의'GROUP BY' 문은 어디에 있습니까? – Phil

+0

@ Phil : Excellent catch. 고마워! –

답변

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보다 작 으면 아직 예제 레코드 세트가 10000보다 큰 tmp.pk를 보여줍니다.

그리고 결합이 잘못되었습니다. 숫자 기반의 문자열 기반 필드에 가입하려고합니다. 나는 구체적으로 말하고있다 : crawl.domain=tmp.pk

나는 당신이 tmp.domain에 의해 JOIN해볼 것을 제안 할 것이다.

또는 @Phil이 답변에서 제안한 것을 더 많이 나타내려면 하위 쿼리를 제거하고 쿼리를 다시 구성하는 것이 좋습니다.

+1

pk가 너무 높다는 점에 대해서는 좋은 지적이지만 답변이 아니라 주석이어야합니다. 또한'crawl.domain'은 실제로 domain.pk에 대한 외래 키라고 생각합니다. – Phil

+1

필 (Phil)이 말하는 내용을 이해하지만 두 테이블 모두에 도메인과 pk가 모두 포함되어 있다고 생각합니다. - 나는 그의 제시된 질의에 기초한 강한 가정이라고 생각한다. –

+0

<10000은 쿼리를 복사 할 때 실수였습니다. 좋은 제안. Upvoted. –