Codeigniter:选择行的 SUM 给出 SUM 乘以 GROUP_CONCAT 结果?

Posted

技术标签:

【中文标题】Codeigniter:选择行的 SUM 给出 SUM 乘以 GROUP_CONCAT 结果?【英文标题】:Codeigniter: Selecting the SUM of rows give the SUM times GROUP_CONCAT results? 【发布时间】:2012-03-30 11:00:26 【问题描述】:

我正在查询四个表(它们是: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 

除了计算正确的票数外,它似乎做了所有事情,它返回票数乘以该项目的标签数。 有谁知道为什么会这样?或者如何解决这个查询?

【问题讨论】:

您是否分析了实际查询以查看原始生成的 SQL?使用$this->output->enable_profiler(TRUE) 并发布实际结果以及您预期的结果。使用edit 链接更新您的问题。 您的资源表中有vote 字段吗? 您好,感谢您的回复。我添加了原始 sql,结果几乎符合我的预期。并且 augustknight 投票字段位于名为 votes 的表中,该表通过资源 id 链接到资源表。 投票列的数据类型是什么? 嘿,Teez,投票列类型是 'int(1)'。 【参考方案1】:

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

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

【讨论】:

嗨,bottlebot,谢谢,它工作得很好!非常感谢您的帮助。

以上是关于Codeigniter:选择行的 SUM 给出 SUM 乘以 GROUP_CONCAT 结果?的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 表达式在 SUM 和 IIF 时给出 #Error

CodeIgniter托管时的日期错误

Codeigniter - 在布尔值上调用成员函数 result_array() - 本地设置安装错误

Codeigniter $this->db->get(),我如何返回特定行的值?

Codeigniter 模型出现错误:列计数与第 2 行的值计数不匹配

CodeIgniter 的 Active Records 中 0 和 sha1(value, true) 的值组合返回所有行的 SQL