【发布时间】:2016-03-04 12:24:16
【问题描述】:
我正在使用 Laravel 5.2 开发一个数据库驱动的网站。我正在使用 Laravel 的手动查询生成器。
我要做的是在第一个查询中使用SQL_CALC_FOUND_ROWS,并在第二个查询中选择FOUND_ROWS()。但它不能正常工作。我的代码如下。
$param = array();
$sql = "SELECT SQL_CALC_FOUND_ROWS `report_items`.`id`,`items`.`name` as `item_name`,`items`.`id` as `item_id`,`items`.`item_code`,`report_items`.`created_at`";
$sql .= ",`users`.`name` as `username`,`users`.`id` as `user_id`";
$sql .= " FROM `report_items` INNER JOIN `items` ON `items`.id=`report_items`.`item_id`";
$sql .= " INNER JOIN `users` ON `users`.`id`=`report_items`.`user_id`";
$sql .= " WHERE 1=1";
$sql .= " LIMIT ?,?";
$param[] = (int)$offset;
$param[] = (int)$limit;
$rows = DB::select($sql,$param);
$count = DB::select("SELECT FOUND_ROWS() as `row_count`")[0]->row_count;
如您所见,我想在第二个查询中检索找到的行。但它没有按预期工作。
第一个查询实际上返回 3 行。但是当我从第二个查询中检索结果时,行数始终为 1。
我的查询有什么问题?
【问题讨论】:
-
难道 laravel 在每次 select() 调用后都会关闭与 db 的连接并再次打开吗?
-
所以没有办法检索 ruturn 的行数?在 codeigniter $this->db->num_rows() 中。那么如何在 laravel 中进行手动选择查询呢??
-
您可以在第一个
SELECT查询中尝试不使用SQL_CALC_FOUND_ROWS和使用COUNT(*) as found_rows吗? @Shadow - 我不是 100% 确定,但打开/关闭 MySQL 连接是没有意义的。如果确实如此,该框架会很糟糕,因为如果这样做,它会像蜗牛一样慢..据我所知,在通过 Laravel 执行查询后查看 MySQL 的show processlist- 进程 ID 不会改变。每个新连接都有一个不同的 id,因此它表明它不是在每个select或请求上关闭/打开。 -
@N.B.我不知道 laravel,但行为将与这种方法一致。顺便说一句,为 mysql 打开和关闭数据库连接并不像 oracle 那样昂贵。这只是代表我的猜测,我会检查一下。
-
使用 COUNT(*) 并运行类似的两个查询是我认为它的性能很差。我的意思是我必须检索所有记录才能获得计数。然后使用 LIMIT 再次运行第二个查询。我想避免它。这就是我考虑 SQL_CALC_FOUND_ROWS 的原因。 @NB
标签: php mysql laravel laravel-5.2