我如何计算mysql查询返回的行数?

时间:2009-03-03 17:08:52

标签: php mysql

如何计算mysql查询返回的行数?使用PHP ..

12 个答案:

答案 0 :(得分:77)

获取查询结果中的总行数...

你可以迭代结果并计算它们。您没有说明您使用的语言或客户端库,但API确实提供了mysql_num_rows函数,可以告诉您结果中的行数。

这在PHP中公开,例如mysqli_num_rows函数。正如您编辑的问题提到您正在使用PHP,这是一个使用mysqli函数的简单示例:

$link = mysqli_connect("localhost", "user", "password", "database");

$result = mysqli_query($link, "SELECT * FROM table1");
$num_rows = mysqli_num_rows($result);

echo "$num_rows Rows\n";

获取符合某些条件的行数...

只需使用COUNT(*) - 请参阅MySQL手册中的Counting Rows。例如:

SELECT COUNT(*) FROM foo WHERE bar= 'value';

使用LIMIT时获取总行数...

如果您使用了LIMIT子句,但想知道没有它的行数,请在查询中使用SQL_CALC_FOUND_ROWS,然后选择SELECT FOUND_ROWS();

SELECT SQL_CALC_FOUND_ROWS * FROM foo
   WHERE bar="value" 
   LIMIT 10;

SELECT FOUND_ROWS();

对于非常大的表,这不会特别有效,并且在运行查询以获取数据页之前,最好运行一个更简单的查询来获取计数并缓存它。

答案 1 :(得分:16)

如果您必须使用简单SQL解决问题,则可以使用子查询。

select count(*) from (select * from foo) as x;

答案 2 :(得分:7)

如果您的SQL查询具有LIMIT子句,并且您想知道该数据集中总共有多少结果,则可以使用SQL_CALC_FOUND_ROWS后跟SELECT FOUND_ROWS();这将返回行数使用COUNT(*)来更有效率 示例(直接来自MySQL文档):

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

答案 3 :(得分:3)

如果你想要结果加上返回的行数做这样的事情。使用PHP。

$query = "SELECT * FROM Employee";
$result = mysql_query($query);
echo "There are ".mysql_num_rows($result)." Employee(s).";

答案 4 :(得分:2)

假设您正在使用mysql_或mysqli_函数,那么您的问题应该已经被其他人回答了。

但是,如果你正在使用PDO,那么很遗憾没有简单的函数来返回select语句检索的行数。您必须在结果集上使用count()(通常在将其分配给局部变量之后)。

或者,如果您只对数字而不是数据感兴趣,请在SELECT COUNT(1)...结果上对PDOStatement :: fetchColumn()感兴趣。

答案 5 :(得分:1)

SELECT SQL_CALC_FOUND_ROWS *
FROM   table1
WHERE  ...;

SELECT FOUND_ROWS();
查询后必须立即调用

FOUND_ROWS()

答案 6 :(得分:1)

如果您使用Wordpress获取数据,则可以使用$ wpdb-> num_rows访问返回的行数:

$wpdb->get_results( $wpdb->prepare('select * from mytable where foo = %s', $searchstring));
echo $wpdb->num_rows;

如果你想要一个基于mysql计数查询的特定计数,那么你可以这样做:

$numrows = $wpdb->get_var($wpdb->prepare('SELECT COUNT(*) FROM mytable where foo = %s', $searchstring );
echo $numrows;

如果您正在运行更新或删除,则直接从函数调用返回受影响的行数:

$numrowsaffected = $wpdb->query($wpdb->prepare(
   'update mytable set val=%s where myid = %d', $valuetoupdate, $myid));

这也适用于$ wpdb-> update和$ wpdb-> delete。

答案 7 :(得分:1)

截至2015年,以及PDO功能的弃用,这只是<?php // Begin Vault (this is in a vault, not actually hard-coded) $host="hostname"; $username="GuySmiley"; $password="thePassword"; $dbname="dbname"; // End Vault $b='</br>'; try { $theCategory="fruit"; // value from user, hard-coded here to get one in $dbh = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // prepared statement with named placeholders $stmt = $dbh->prepare("select id,foodName from foods where category=:theCat and perishable=1"); $stmt->bindParam(':theCat', $theCategory, PDO::PARAM_STR,20); $stmt->execute(); echo "rowCount() returns: ".$stmt->rowCount().$b; // See comments below from the Manual, varies from driver to driver $stmt = $dbh->prepare("select count(*) as theCount from foods where category=:theCat and perishable=1"); $stmt->bindParam(':theCat', $theCategory, PDO::PARAM_STR,20); $stmt->execute(); $row=$stmt->fetch(); // fetches just one row, which is all we expect echo "count(*) returns: ".$row['theCount'].$b; $stmt = null; // PDO closes connection at end of script } catch (PDOException $e) { echo 'PDO Exception: ' . $e->getMessage(); exit(); } ?> - 仅可视化。

create table foods
(   id int auto_increment primary key,
    foodName varchar(100) not null,
    category varchar(20) not null,
    perishable int not null
);
insert foods (foodName,category,perishable) values 
('kiwi','fruit',1),('ground hamburger','meat',1),
('canned pears','fruit',0),('concord grapes','fruit',1);

用于测试的模式

2

对于我的实施,我得到上面echos的{​​{1}}的输出。上述两种策略的目的是确定您的驱动程序实现是否发出rowCount,如果不是,则寻求后退策略。

来自PDOStatement::rowCount上的手册:

  

PDOStatement :: rowCount()返回受a影响的行数   DELETE,INSERT或UPDATE语句。

     

For most databases,PDOStatement :: rowCount()不返回   受SELECT语句影响的行数。相反,使用   PDO :: query()发出带有相同的SELECT COUNT(*)语句   将谓词作为预期的SELECT语句,然后使用   PDOStatement :: fetchColumn()来检索将要的行数   被退回然后,您的应用程序可以执行正确的操作。

答案 8 :(得分:1)

这不是问题的直接答案,但是在实践中,我经常想对结果集中的 行数进行估计。对于大多数类型的查询,MySQL的“ EXPLAIN”都可以提供。

例如,如果解释看起来很糟糕,我会使用它拒绝运行客户端查询。

然后还每天在每个涉及的MySQL服务器上的表上运行“ ANALYZE LOCAL TABLE”(复制外,以防止集群锁定)。

答案 9 :(得分:0)

基础

要获取SQL中匹配的行数,通常应使用COUNT(*)。例如:

SELECT COUNT(*) FROM some_table

要在PHP中获得该值,您需要从返回结果第一行的第一列中获取该值。下面演示了使用PDO和mysqli的示例。

但是,如果您想获取结果,但仍然知道使用PHP获取了多少条记录,则可以使用count()或利用DB API提供的结果对象中的预填充计数例如mysqli's num_rows

使用MySQLi

使用mysqli,您可以使用fetch_row()获取第一行,然后访问0列,该列应包含COUNT(*)的值。

// your connection code
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'dbuser', 'yourdbpassword', 'db_name');
$mysqli->set_charset('utf8mb4');

// your SQL statement
$stmt = $mysqli->prepare('SELECT COUNT(*) FROM some_table WHERE col1=?');
$stmt->bind_param('s', $someVariable);
$stmt->execute();
$result = $stmt->get_result();

// now fetch 1st column of the 1st row 
$count = $result->fetch_row()[0];

echo $count;

如果您想获取所有行,但仍知道行数,则可以使用num_rowscount()

// your SQL statement
$stmt = $mysqli->prepare('SELECT col1, col2 FROM some_table WHERE col1=?');
$stmt->bind_param('s', $someVariable);
$stmt->execute();
$result = $stmt->get_result();

// If you want to use the results, but still know how many records were fetched
$rows = $result->fetch_all(MYSQLI_ASSOC);

echo $result->num_rows;
// or
echo count($rows);

使用PDO

使用PDO更加简单。您可以直接在语句上调用fetchColumn()以获取单个列值。

// your connection code
$pdo = new \PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '', [
    \PDO::ATTR_EMULATE_PREPARES => false,
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
]);

// your SQL statement
$stmt = $pdo->prepare('SELECT COUNT(*) FROM some_table WHERE col1=?');
$stmt->execute([
    $someVariable
]);

// Fetch the first column of the first row
$count = $stmt->fetchColumn();

echo $count;

同样,如果您仍然需要获取所有行,则可以使用count()函数来获取它。

// your SQL statement
$stmt = $pdo->prepare('SELECT col1, col2 FROM some_table WHERE col1=?');
$stmt->execute([
    $someVariable
]);

// If you want to use the results, but still know how many records were fetched
$rows = $stmt->fetchAll();

echo count($rows);

PDO的语句不提供具有提取的行数的预先计算的属性,但是它具有称为rowCount()的方法。该方法可以告诉您结果中返回的行数,但是不能依靠它,通常不建议使用。

答案 10 :(得分:0)

> SELECT COUNT(*) AS total FROM foo WHERE bar= 'value';

答案 11 :(得分:0)

使用如下2个查询,一个是获取有限制的数据,另一个是获取匹配行的总数。

例如:

SELECT * FROM tbl_name WHERE id > 1000 LIMIT 10;
SELECT COUNT(*) FROM tbl_name WHERE id > 1000;

Mysql guide 所述,这是最优化的方式,SQL_CALC_FOUND_ROWS 查询修饰符和 FOUND_ROWS() 函数也不推荐使用强> MySQL 8.0.17