mysql - 计数: multiple queries or one query with multiple subqueries?

标签 mysql codeigniter

我想做一个总结脚本,比如今天、昨天、本周、上周、本月、上个月等有多少新用户。

我正在使用 CodeIgniter,所以我想知道哪一个更好?在模型上使用多次调用,如下所示:

$this->model->get_today_users();
$this->model->get_yesterday_users();
$this->model->get_this_week_users();
// so on

上面的每个函数仅返回特定日期范围内的用户数量(例如 SELECT COUNT(*) WHERE join_date=NOW() for Today_users 等 - 当然使用 CI 事件记录)。

或者使用一个包含所有必需子查询的查询更好,如下所示:

function stats(){
$this->db->select('*');
$this->db->select('(SELECT COUNT(*) FROM users WHERE join_date=NOW()) as today');
$this->db->select('(SELECT COUNT(*) FROM users WHERE join_date=NOW()-INTERVAL 1 DAY) as yesterday');
$this->db->select('(SELECT COUNT(*) FROM users WHERE WEEK(join_date)=WEEK(NOW()) ) as this_week');
$this->db->select('(SELECT COUNT(*) FROM users WHERE WEEK(join_date)=WEEK(NOW())-1 ) as last_week');
$this->db->select('(SELECT COUNT(*) FROM users WHERE MONTH(join_date)=MONTH(NOW()) ) as this_month');
$this->db->select('(SELECT COUNT(*) FROM users WHERE MONTH(join_date)=MONTH(NOW())-1 ) as last_month');
$this->db->from('users');
$ret = $this->db->get();
}

然后调用例如 $data['stat'] = $this->model->stats();所以在 View 中,我可以调用 $stat->today、$stat->this_week 等。

提前感谢您的回答。

更新:如果我想创建一个接收日期的函数怎么办?假设我必须像这样循环一个月:

//for the sake of simplicity
foreach(day in a month as $r){
    $this->model->get_user_on_this_day($r);
}

这意味着一个月有 30 天,它将循环 30 次!还有比这更好的办法吗?

最佳答案

正确的答案可能是:这取决于情况。从代码可重用性和可读性的角度来看,第一个选项可能更好。另一方面,第二个选项意味着您只需联系数据库一次而不是三次。因此,后者在性能方面可能会更好,因为这意味着您只联系数据库一次,这意味着只有一次连接、一次事务等。对于大型数据库、缓慢的连接等,这意味着更快的结果。

关于mysql - 计数: multiple queries or one query with multiple subqueries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8397347/

相关文章:

PHP:在 var 中使用字段名进行 MySQL 查询

mysql - 在选择子查询中选择花费的时间太长

mysql - 在 codeigniter 中将 excel 表导入 mysql 数据库

php - Codeigniter 不正确的 CAPTCHA 图像 src

php - codeigniter 查询问题与 where 条件

php - 交响乐 2.8 : CollectionType - do not delete old entries

javascript - 多个条件到一个复选框

php - 基于字符串 "1,5,3,7"的 SQL 查询 -> 保持结果顺序

php - 需要插入不重复的SQL

php - 如果有一些依赖性,则将记录添加到 codeigniter 中的列