[英]MySQL: Get only count of result set
我在PHP / MySQL中使用MVC。
假设我正在使用具有不同查询的10个函数从数据库中获取详细信息。
但是在其他时候,我可能只想获取查询返回的结果计数。
处理这种情况的标准方法是什么?
我是否应该再编写10个函数,这些函数几乎重复整个查询并仅返回计数。
要么
我是否应该始终将计数与结果集一起返回
要么
我可以传递一个标志来指示该函数应仅返回计数,然后基于该标志,我将动态生成查询的(选择部分)。
要么
有没有更好的办法?
现在,mysql支持子查询,您可以使用以下命令获取任何查询的计数:
$count_query="SELECT COUNT(*) FROM ($query)";
那有多难?
但是,这种方法始终意味着您正在运行两个查询,而不是仅运行一个查询(我不确定MySQL是否一定能够使用缓存的结果集进行计数-试用一下,看看)。
如果您已经获取了整个结果集,则对PHP中的行进行计数可能比发出另一个查询更快。
MySQL中有2个函数,它们将在应用limit语句之前返回匹配的行数:
SQL_CALC_FOUND_ROWS和FOUND_ROWS()
看到
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
C。
如果仅希望满足特定条件的行数,则不应使用结果计数,而应使用仅选择count(*)的另一个查询。
如果既需要数据又需要计数,为什么不只在结果数组上使用count()?
另一种方法是使用一些class
,可以返回数据和它; S计数,而不是不同类的各10个查询,但一个单一的数据库访问类。
我会用旗帜的主意。
再编写10个功能和复制/粘贴代码根本无法提高可读性。 如果您还总是返回计数,则意味着无论何时您仅对计数感兴趣,数据库仍必须生成并传输可能效率极低的完整结果集。
带有标志,您将拥有类似
function getData($countOnly=false) {
// ...generate FROM and WHERE clause
if ($countOnly) {
$query = 'SELECT COUNT(*) '.$query;
} else {
$query = 'SELECT field1, field2, ...'.$query.' ORDER BY ...';
}
...
}
我通常会尝试在方法之间共享尽可能多的代码。 一种可能是:
select()
和一个count()
函数
buildFromAndWhere()
函数来构建查询的常见部分。
select()
和count()
使用那个
用伪代码编写,看起来可能像这样:
function select($params) {
return "select * "
. from()
. where($params)
. "limit 0, 10";
}
function count() {
return "count(*) as nbr "
. from()
. where();
}
function from() {
return "from table1 inner join table1 on ... ";
}
function where($params) {
// Use $params to build the where clause
return "where X=Y and Z=blah";
}
这样,您就可以在from()
和where()
函数中使用尽可能多的通用代码-考虑到查询中经常遇到的困难部分是最好的。
我更喜欢选择和计数两个独立的函数; 我认为这使代码更易于阅读和理解。
我不喜欢一种方法返回两个不同数据(结果列表和总计数)的想法; 我也不喜欢传递标志的想法:查看函数的调用,您将永远不知道该参数的含义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.