PHP Mysql总行与FOUND_ROWS()和WHERE条件

时间:2014-04-25 15:07:40

标签: php mysql

我从数据库中获得x行数,这些行与'totalRows'相加。从行中我还想总计那些结果列等于'win'的行。我没有看到'totalWins'回声的答案。

任何想法我做错了什么?

提前致谢。

public static function getList( $numRows=10000, $order="id DESC" ) {
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM table
        ORDER BY " . mysql_escape_string($order) . " LIMIT :numRows";

$st = $conn->prepare( $sql );
$st->bindValue( ":numRows", $numRows, PDO::PARAM_INT );
$st->execute();
$list = array();

while ( $row = $st->fetch() ) {
  $article = new Article( $row );
  $list[] = $article;
}

// Now get the total number of rows that matched the criteria
$sql = "SELECT FOUND_ROWS() AS totalRows";
$totalRows = $conn->query( $sql )->fetch();
$conn = null;
return ( array ( "results" => $list, "totalRows" => $totalRows[0] ) );

// Now get the total number of rows WITH CONDITION matched
$sql = "SELECT FOUND_ROWS() AS totalWins WHERE result = 'win'";
$totalWins = $conn->query( $sql )->fetch();
$conn = null;
return ( array ( "results" => $list, "totalWins" => $totalWins[0] ) );

1 个答案:

答案 0 :(得分:1)

您的语句SELECT FOUND_ROWS() AS totalWins WHERE result = 'win'将产生错误,而不是结果集。 FOUND_ROWS()只是给你一个整数,它不会让你访问上一个查询中的表来进行进一步的过滤。由于您没有引用语句中的任何表,因此MySQL不知道列result

您可以在一个查询中获得所需的两个计数,如下所示:

SELECT FOUND_ROWS() AS totalRows, COUNT(*) AS totalWins FROM table WHERE result = 'win';

FOUND_ROWS()函数将查看上一个查询中的SQL_CALC_FOUND_ROWS,并返回一个整数。查询的其余部分就像将FOUND_ROWS()的结果包含在结果集中的字段一样工作。

请注意,当您要求将常量值(如FOUND_ROWS()的结果)作为查询中的字段时,它将对查询中的所有行重复。另一方面,当您询问聚合函数的结果(如COUNT())时,查询结果将仅限于一行。这些是潜在的"陷阱" - 如果我不清楚我的意思,请尝试运行这些查询并检查结果集(按顺序):

SELECT COUNT(*), result FROM table LIMIT 1000;
SELECT FOUND_ROWS(), result FROM table LIMIT 1000;

您还将PDO与已弃用的mysql_扩展程序(mysql_escape_string())中的函数一起使用;最好坚持使用一个API而不是混合和匹配。文档lists PDO::quote() as an alternative

$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM table 
        ORDER BY " . $conn->quote($order) . " LIMIT :numRows";

请注意,文档makes the following recommendation

  

如果您正在使用此函数来构建SQL语句,那么您就是   强烈建议使用PDO :: prepare()来准备SQL语句   使用绑定参数而不是使用PDO :: quote()进行插值   用户输入到SQL语句中。带有约束的预备语句   参数不仅更便携,更方便,不受SQL的影响   注入,但通常比插值快得多   查询,因为服务器端和客户端都可以缓存已编译的表单   查询。