2012-07-13 3 views
1

글쎄, 이건 저를위한 머리 기사입니다. 태그가있는 게시물 시스템이 있습니다. 태그는 게시물과 많은 관계가 있습니다.MySQL은 많은 일치 항목과 일치하는 항목이 많은 곳을 얻습니다.

문제는 현재 게시물과 일치하는 태그 수에 따라 다른 게시물을 선택하고 싶습니다.

빠른 시각적 예 : 나는 포스타를 입력하면

PostA: TagA, TagB 
PostB: TagC 
PostC: TagA 
PostD: TagA, TagB 

그래서, 그것은 나에게 PostD, PostC을 줄 것입니다.

저는이 문제로 어디서부터 시작해야할지 몰라요. 나는이 문제에 대해 이미 뛰어 들고 도움을 줄 수있는 사람보다 더 똑똑한 사람을 바라고 있습니다.

답변

5

확인하므로 태그 게시물 테이블을 가정하여 실제로 다음과 같습니다

PostA TagA 
PostA TagB 
PostB TagC 
PostC TagA 
PostD TagA 
PostD TagB 

는 당신은

SELECT post FROM tagged_posts 
    WHERE post != 'PostA' 
    AND tag in (SELECT tag FROM tagged_posts WHERE post = 'PostA') 
    GROUP BY post 
    ORDER BY COUNT(*) desc 
+0

아주 좋은 간단한 해결책. – Hogan

+0

완벽합니다. 워드 프레스에서 작동하도록 수정해야했습니다 (Wordpress 버전이 필요한 다른 모든 사람들에게 답변으로 게시 할 예정입니다). 다시 한 번 감사드립니다! 이제 무작위로 20 개 중에서 6 개를 무작위로 선택하는 방법을 알아 내기 위해 PHP에서이를 수행 할 것입니다. – Ben

+1

@mazzzzz 질의 끝에'LIMIT 6 '을 추가하십시오. – bfavaretto

0

을 원하는 사람이 관심이 있다면 여기에 워드 프레스 버전입니다. 태그를 사용하지만 (카테고리에 쉽게 수정할 수 있음) 다른 사람에게도 도움이되기를 바랍니다.

참고 : $ wpdb 클래스 (함수에서 전역 호출이 필요함)와 the_post()에 대한 호출로 자동 설정되는 $ post-> ID, 그렇지 않으면 수동으로 설정해야합니다.

$query = $wpdb->get_results(" 
SELECT posts.* 
FROM {$wpdb->term_relationships} as relate 
LEFT JOIN {$wpdb->term_taxonomy} as taxonomy 
    ON relate.term_taxonomy_id = taxonomy.term_taxonomy_id 
LEFT JOIN {$wpdb->terms} as terms 
    ON taxonomy.term_id = terms.term_id 
LEFT JOIN {$wpdb->posts} as posts 
    ON posts.ID = object_id 
WHERE object_id != '{$post->ID}' 
    AND taxonomy = 'post_tag' 
    AND taxonomy.term_id in 
     (
      SELECT term_id 
      FROM {$wpdb->term_relationships} as relate 
      LEFT JOIN {$wpdb->term_taxonomy} as taxonomy 
       ON relate.term_taxonomy_id = taxonomy.term_taxonomy_id 
      WHERE object_id = '{$post->ID}' 
     ) 
GROUP BY object_id 
ORDER BY COUNT(*) desc 
"); 
관련 문제