Codeigniter:选择行的SUM将给出GROUP_CONCT结果的SUM时间


Codeigniter: Selecting the SUM of rows give the SUM times GROUP_CONCAT results?

我正在查询四个表(它们是:resources、tag_list、resource_tags和votes),并试图检索资源列表,每个列表项都有分组标签和该资源的投票总数。

这是我目前的型号:

$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 

除了计算正确的票数外,它似乎什么都能做,它返回的票数乘以该项目的标签数。有人知道为什么会发生这种事吗?或者如何修复此查询?

为什么不使用子查询来获得选票?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);

这也有望解决你的问题。让我知道这是否有效!如果需要,我会在自己的系统上创建一个测试查询,以获得您想要的结果。