在Codeigniter中计算由distinct()或group_by()过滤的结果

vd2z7a6w  于 2023-04-09  发布在  其他
关注(0)|答案(4)|浏览(124)

我想用CI(使用PostgreSQL)计算一个活动记录查询的结果。我使用的是count_all_results(),它对大多数查询都能正常工作,但在连接后使用distinct()group_by()时就不行了,因为count_all_results()忽略了这些函数。
这是一个修复,它还没有在最新的(2.1.3)稳定版本中实现。https://github.com/EllisLab/CodeIgniter/commit/b05f506daba5dc954fc8bcae76b4a5f97a7433c1
当我自己尝试在当前版本中实现此修复时,没有进行额外的过滤。行数保持不变。
关于如何在当前版本中实现这一点,或者如何计算distinct()group_by()过滤的结果,有什么提示吗?

gzszwxb4

gzszwxb41#

$this->db->select('COUNT(id)');
    $this->db->join();
    $this->db->distinct();
    $this->db->group_by();
//...etc ...
    $query = $this->db->get('mytable');

    return count($query->result());

$this->db->join();
    $this->db->distinct();
    $this->db->group_by();
//...etc ...
    $query = $this->db->get('mytable');

    return $query->num_rows();
eni9jsuy

eni9jsuy2#

你可以用

$this->db->group_by();

否则

$this->db->distinct();
qojgxg4l

qojgxg4l3#

在我的例子中,到目前为止使用Codeigniter 3.1.11,在执行count_all_results()时,distinct()* 被 * 考虑在内。但是,您必须使用该函数,执行$this-〉db-〉select(“distinct x”),然后计数,不会对记录计数应用DISTINCT限制。

30byixjq

30byixjq4#

享受Codeigniter提供的语法糖可以是:

return $this->db->distinct()->select('non_unique_column')->count_all_results('your_table');

return $this->db->select('DISTINCT non_unique_column')->count_all_results('your_table');

但请记住,呈现的SQL将是(根据您的db驱动程序有一些变化):

SELECT COUNT(*) AS "numrows"
FROM (
SELECT DISTINCT non_unique_column
FROM your_table
) CI_count_all_results

如果你的结果集不需要隔离不同的值,因为结果将被保证是唯一的,那么你可以简单地用途:

return $this->db->count_all_results('your_table');

这个简单的代码将生成以下呈现的SQL:

SELECT COUNT(*) AS "numrows"
FROM "STL_PROPERTYME_PORTFOLIO"

无论您的实现如何,count_all_results()都将始终返回一个非负整数,而不必显式地通过名称引用列。

相关问题