2012-03-14 2 views
2

4 개의 테이블 (resources, tag_list, resource_tags 및 vote)을 쿼리하고 그룹화 된 태그가있는 각 목록 항목 및 해당 자원에 대한 투표 합계로 자원 목록을 검색하려고합니다.Codeigniter : 행 SUM을 선택하면 SUM 시간에 GROUP_CONCAT 결과가 표시됩니까?

이 내 현재 모델 :

$this->db->select('*'); 
$this->db->select('GROUP_CONCAT(DISTINCT tag SEPARATOR " | ") AS tags, SUM(vote) AS sumvotes'); 
$this->db->from('resources'); 
$this->db->join('resource_tags', 'resources.r_id = resource_tags.resource_id', 'left'); 
$this->db->join('tag_list', 'tag_list.t_id = resource_tags.tag_id', 'left'); 
$this->db->join('votes', 'votes.resource_id = resources.r_id', 'left'); 
$this->db->where('resources.published', '1'); 
$this->db->group_by('resources.r_id'); 
$this->db->order_by('votes.vote', 'desc'); 
$query = $this->db->get(); 

편집 : 여기에 원시 생성 된 SQL 투표의 정확한 수를 계산을 제외하고 모든 것을 할 것 같다

SELECT *, GROUP_CONCAT(DISTINCT tag SEPARATOR " | ") AS tags, SUM(vote) AS sumvotes 
FROM (`olu_resources`) 
LEFT JOIN `olu_resource_tags` ON `olu_resources`.`r_id` = `olu_resource_tags`.`resource_id` 
LEFT JOIN `olu_tag_list` ON `olu_tag_list`.`t_id` = `olu_resource_tags`.`tag_id` 
LEFT JOIN `olu_votes` ON `olu_votes`.`resource_id` = `olu_resources`.`r_id` 
WHERE `olu_resources`.`published` = '1' 
GROUP BY `olu_resources`.`r_id` 
ORDER BY `olu_votes`.`vote` desc 

이, 그것은 수를 반환 투표 수에는 해당 항목에있는 태그 수가 곱 해져 있습니다. 왜 이런 일이 일어나는 지 아십니까? 또는이 쿼리를 수정하는 방법은 무엇입니까?

+0

실제 생성 된 SQL을 확인하기 위해 실제 쿼리를 프로파일 링 했습니까? '$ this-> output-> enable_profiler (TRUE)'를 사용하여 실제 결과와 기대 한 결과를 게시하십시오. [편집] 링크를 사용하여 질문을 업데이트하십시오. –

+0

리소스 테이블에'vote' 필드가 있습니까? – augustknight

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 난 원시 SQL을 추가했습니다, 결과는 거의 내가 기대했던 것입니다. 그리고 augustknight 투표 필드는 자원 ID에 의해 자원 테이블에 연결된 투표라는 테이블에 있습니다. – David

답변

0

투표를하기 위해 서브 쿼리를 사용하지 않는 이유는 무엇입니까? CI의 액티브 레코드는 단순한 쿼리에는 사용하기 쉽지만, 당신처럼 복잡한 쿼리가있을 때는 어렵습니다.

프로필러를 먼저 확인하고 속도 차이를 살펴 보더라도 Active Record를 사용하는 것이 가능할 수 있습니다. 지난 번에 나는 7 초의 차이를 만들었습니다. 나는 이런 식으로 뭔가를 시도 할 것입니다 :

$SQL = "SELECT *, GROUP_CONCAT(DISTINCT tag SEPARATOR ' | '), 
(SELECT SUM(vote) FROM olu_votes WHERE olu_votes.resource_id = olu_resources.r_id) AS sumvotes 
FROM (olu_resources) 
LEFT JOIN olu_resource_tags ON olu_resources.r_id = olu_resource_tags.resource_id 
LEFT JOIN olu_tag_list ON olu_tag_list.t_id = olu_resource_tags.tag_id 
LEFT JOIN olu_votes ON olu_votes.resource_id = olu_resources.r_id 
WHERE olu_resources.published = '1' 
GROUP BY olu_resources.r_id 
ORDER BY olu_votes.vote desc" 

$this->db->query($SQL); 

이 희망 또한 당신의 문제를 해결해야한다. 이게 작동하는지 알려주세요. 필요하면 내 시스템에서 테스트 결과를 만들어 원하는 결과를 얻습니다.

+0

안녕 병 뚜껑, 그 덕분에, 그것은 위대한 작품! 도움에 정말 감사드립니다. – David

+0

기꺼이 도와 드리겠습니다. – bottleboot