我在PHP / MySQL中使用MVC。
假设我使用10个具有不同查询的函数从数据库中获取详细信息
但在其他时候,我可能只想获得查询返回的结果计数
处理这种情况的标准方法是什么
我应该再写10个函数来复制几乎整个查询并只返回计数
或
我是否应该始终使用结果集
返回计数
或
我可以传递一个标志来指示该函数应该仅返回计数,然后根据该标志我将动态生成(选择部分)查询。
或
有没有更好的办法?
答案 0 :(得分:2)
现在mysql支持子查询,您可以使用以下命令获取任何查询的计数:
$count_query="SELECT COUNT(*) FROM ($query)";
那有多难?
然而,这种方法总是意味着你正在运行两个查询而不是一个(我不确定MySQL是否一定能够使用缓存的结果集来计算 - 试试看看)。 p>
如果您已经获取了整个结果集,那么计算PHP中的行可能比发出另一个查询更快。
MySQL中有两个函数可以在应用限制语句之前返回匹配的行数:
SQL_CALC_FOUND_ROWS和FOUND_ROWS()
见
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
下进行。
答案 1 :(得分:1)
如果只想要符合某些条件的行数,则不应使用结果计数,而应使用另一个仅选择count(*)的查询。
如果你需要数据和它的数量,你为什么不在结果数组上使用count()?
另一种方法是使用一些class
可以返回数据和它; s count,但不是每个10个查询的不同类,而是一个单一的数据库访问类。
答案 2 :(得分:1)
我会选择国旗的想法。
再编写10个函数并复制/粘贴代码根本没有帮助。如果您始终也返回计数,这意味着只要您只对计数感兴趣,数据库仍然必须生成并传输可能非常低效的完整结果集。
有了旗帜,你就会有类似
的东西function getData($countOnly=false) {
// ...generate FROM and WHERE clause
if ($countOnly) {
$query = 'SELECT COUNT(*) '.$query;
} else {
$query = 'SELECT field1, field2, ...'.$query.' ORDER BY ...';
}
...
}
答案 3 :(得分:0)
我通常会尽量在方法之间共享尽可能多的代码。可能性是:
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()
函数中拥有尽可能多的通用代码 - 考虑到查询的 hard 部分通常存在,它适用于最好的。
我更喜欢有两个独立的功能来选择和计数;我认为它使代码更容易阅读和理解。
我不喜欢一种方法的想法,它返回两个不同的数据(结果列表和总计数);我也不喜欢传递旗帜的想法:看看函数的调用,你永远不会知道那个参数意味着什么。