2012-03-14 117 views
2

我在查詢四個表(它們是:資源,tag_list,resource_tags和投票),並試圖檢索每個列表項具有分組標記和該資源的投票總和的資源列表。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)'並且發佈實際結果以及你期望的結果。使用[編輯]鏈接更新您的問題。 – 2012-03-14 00:31:58

+0

資源表中的「投票」字段? – augustknight 2012-03-14 00:36:19

+0

嘿,謝謝你的回覆。我已經添加了原始的sql,結果幾乎是我所期望的。而augustknight投票字段位於表格中,該表格由資源ID鏈接到資源表。 – David 2012-03-14 00:48:11

回答

0

爲什麼不使用子查詢來獲得投票? CI中的Active Record非常適合用於簡單查詢,但在遇到像您這樣更復雜的查詢時很難(並且很慢)。

雖然我會首先檢查分析器並查看速度的差異,但它可能是所有可能的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 2012-03-14 23:17:55

+0

很高興我能幫到你 – bottleboot 2012-03-15 10:22:37