2011-11-25 4 views
2

검색을 위해 기사 콘텐츠의 전체 텍스트 색인을 구성하는 두 개의 테이블이 있습니다. 테이블 중 하나는 단어와 연관된 기본 키일 뿐이지 만 다른 레코드는 발생한 기사와 문서에서의 위치를 ​​기록합니다. 한 단어가 여러 위치에있는 동일한 문서에 여러 번 나타날 수 있으므로 동일한 단어 ID가 word_locations 테이블에서 여러 번 나타날 수 있습니다.하나의 테이블에서 다른 테이블의 ID로 MySQL 결합 수를 계산하십시오.

단어 : 여기

는 구조입니다

id   bigint 
word  tinytext 

word_location : 내가 뭘 작성해야하는 각 단어에 대한 위해 발생의 수를 찾을 수 쿼리가

id   bigint(20) 
wordid  bigint(20) 
location int(11) 
article_id int(11) 

하나의 프로필. 나는 전혀 나타나지 않는 wordid에 대해 0 값을 유지해야하므로이 값이 왼쪽 조인이어야한다고 가정합니다. 그러나 기사를 제한하기 위해 where 쿼리를 추가하려고 할 때마다 전혀 나타나지 않는 wordid는 결과 집합에 포함되지 않습니다.

이 나는 ​​시도했다 :

select words.wordid, COUNT(word_location.wordid) as appears from words left join word_location on word.id = word_location.wordid where article_id = %s GROUP BY wordid 

그러나이 쿼리는 전혀 나타나지 않는 단어 0을 반환하지 않습니다.

어떻게이 왼쪽 결합을 수정할 수 있습니까?

미리 감사드립니다.

EDIT : 여기

설정 예 데이터와 다른 쿼리에 대한 결과 집합이다.

예 기사 내용 :

밥의 레스토랑은 최고의 터키 요리를 즐길 수있는 더 큰 카운티에서 최고의 레스토랑 중 하나입니다.

그래서 어휘 테이블, 중지 단어를 제외하는 응용 프로그램에 의해 조정 된 후, Bob, Restaurant, finest, greater, county, enjoy, Turkishcusine에 대한 어휘 행에있을 것이다. - 단어 - wordid 차례 나오는 : (이 세트에서 첫 번째 이후 나는이 실제 기사를 사용하고 있기 때문에 IDS 실제로 정수부터 표시 1.

@ 마크 베니 스터가 제공하는 쿼리는이 설정 결과를 생성

128 clifton 0 
1 bob's 2 
2 restaurant 2 
3 one 1 
4 finest 3 
5 restaurants 2 
6 greater 1 
9 county 1 
12 enjoy 3 
13 turkish 6 
14 cuisine 1 

결과 집합 자체는 정확하지만, ID 128은 문서에 전혀 나타나지 않고 출현 횟수 0 인 결과 집합에서 유일한 것입니다. 목표는 전체 어휘를 ​​number 문서의 출현 횟수 (대략 2500 단어)

내 원래의 문제 위의 편집 이전의 쿼리는 실제로 동일한 결과 집합을 반환했지만 발생 행이 전혀 없었습니다.

답변

3

당신은 당신의 조인 조건에 당신의 기사 선택을 포함해야합니다

select words.wordid, COUNT(word_location.wordid) as appears 
from words 
left join word_location on word.id = word_location.wordid and article_id = ? 
GROUP BY wordid 

효과적으로 다시 내부 조인에 가입 좌회전 WHERE 절에서 article_id를에 대한 제한을 포함.

+0

나는 당신이 말하는 것을 얻는다 고 생각하지만,이 쿼리는 오직 하나의 제로 양의 결과만을 생성하는 것처럼 보입니다. 그리고 나는 왜 그 특정한 것이 반환되었는지를 판단 할 수 없습니다. 그 외의 나머지 결과 집합은 원래의 잘못된 쿼리와 동일합니다. 감사! – DeaconDesperado

+0

@DeaconDesperado, 질문에 샘플 데이터를 포함시킬 수 있습니까? –

+0

물론 - 일반적인 데이터 또는 결과 집합의 예가 두 개의 다른 쿼리에 의해 반환됩니까? – DeaconDesperado

0

추측이 하나의 비트,하지만 난 생각 COUNT() 그냥, 당신의 널 (null)을 무시하고 그들을 계산하고 0에 도착한다 (NULL + NULL! = 0) IFNULL에서

봐() 함수 , 당신은 뭔가를 할 수 있습니다

COUNT(IFNULL(word_location.wordid, 0))

(면책 조항 - 나는 따라서이 조금 투기 오라클의 NVL() 함수에 더 익숙해!)

1

나는 부속을 사용합니다 조인 대신.

SELECT words.id, (SELECT count(*) FROM word_location WHERE word_location.wordid = words.id) as appears 
+0

감사합니다 Ken - 다음과 같이 조정하여 정확한 세트를 반환합니다. | 단어 선택 | (단어 수 선택 (*)에서 단어 위치 찾기 | - 여전히 이것이 참여로 성취 될 수 있는지 궁금해합니다. – DeaconDesperado

관련 문제