2012-03-14 7 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

こんにちはbottlebot、ありがとう、それは素晴らしい作品!私は本当に助けに感謝します。 – David

+0

うれしい – bottleboot

関連する問題