2014-05-15 3 views
-1

이 내가 검색 만든 간단한 대다 쿼리를 가지고 조인 검색 결과를 분류 :MySQL은

SELECT article.*, COUNT(article.id) as hits 
FROM article 
JOIN article_tag ON article.id = article_tag.article_id 
JOIN tag ON tag.id = article_tag.tag_id 
WHERE (
    tag.title = "Foo" 
    OR tag.title = "Bar" 
    OR tag.title = "Foo Bar" 
    OR article.title LIKE "%Foo%" 
    OR article.title LIKE "%Bar%" 
    OR article.title LIKE "%Foo Bar%" 
) 
AND (article.start <= NOW() OR article.start IS NULL) 
AND (article.end > NOW() OR article.end IS NULL) 
AND (article.type = 'USER') 
AND article.enabled = 1 
GROUP BY article.id 
ORDER BY hits DESC LIMIT 0, 16 

탐색 충분히 잘 작동하지만 '히트'가 잘 될 수 없습니다보고 그래서 정렬은 꺼져 있습니다.

편집 : 내 문제를 조금 더 잘 설명 할 수 있다고 생각합니다. I가 첫 번째 라인을 변경하는 경우 :

SELECT article.title, tag.title 

제거 GROUP BY와 ORDER BY, ALL 참조 tag.titles으로 문서 제목과 일치하는 결과 목록 - 그래서 대부분의 태그 기사합니다 (searchword 일치 여부) 가장 많은 조회수를 기록합니다.

+0

당신은'선택 기사. * ... GROUP BY article.id'해서는 안됩니다. 이것은 당신에게 예기치 않은 결과를 줄 것입니다. ANSI 표준'GROUP BY'를 사용하십시오. – Kermit

+0

@Kermit : 아니요. 이것은 MySQL에 의해 해석되므로 SQL 표준입니다. ID는 기사 레코드를 고유하게 식별하므로 집계없이 모든 열에 액세스 할 수 있습니다. –

+0

@saibotd : 기사와 일치하는 태그의 수를 선택합니다. 결과에 대해 무엇을 잘못 생각합니까? 예제를 줄 수 있습니까? –

답변

1

COUNT(article.id)은 article.id가 null이 아닌 모든 레코드를 센다. 그게 전부 기록이야. 따라서 COUNT(*)과 같습니다. 일치하는 기사 태그의 수를 계산하고 있습니다. 이 기사의 수를 계산하려면

, 당신은 별개의 문서 ID를 셀 수 :

이 같은 시도하면 어떻게
COUNT(DISTINCT article.id) 
+0

이제 '조회수'는 항상 1입니다. – saibotd

+0

아, article.id로 그룹화 한 것을 보지 못했습니다. 물론 내 대답은 쓸모가 없다. 지금까지 기사별로 그룹화하고 일치하는 태그를 계산했습니다. 이제 기사별로 그룹화하고 각 기사에 대해 1을 계산합니다. 죄송합니다. –

+0

죄송합니다. 도움을 주셔서 감사합니다. – saibotd

1

. 그것을 줘

SELECT article.*,X.hits 
FROM article 
JOIN article_tag ON article.id = article_tag.article_id 
JOIN tag ON tag.id = article_tag.tag_id 
JOIN 
(
select id,COUNT(id) as hits 
from article 
group by id 
) X ON article.id = X.id 
WHERE (
    tag.title in('Foo','Bar','Foo Bar') 
    OR article.title LIKE "%Foo%" 
    OR article.title LIKE "%Bar%" 
    OR article.title LIKE "%Foo Bar%" 
) 
AND (article.start <= NOW() OR article.start IS NULL) 
AND (article.end > NOW() OR article.end IS NULL) 
AND (article.type = 'USER') 
AND article.enabled = 1 
ORDER BY X.hits DESC LIMIT 0, 16