如何计算mysql查询返回的行数?使用PHP ..
答案 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子句,但想知道没有它的行数,请在查询中使用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,您可以使用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_rows
或count()
。
// 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更加简单。您可以直接在语句上调用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