Mysql count(expr)返回';1';在结果集为空(即零行)的表上
我想在下面的查询中返回SELECT语句检索到的行中非空值数量的计数。我注意到,当我对结果集为空的表执行查询时,$stmt->num_rows返回值1 我的完整代码如下所示:Mysql count(expr)返回';1';在结果集为空(即零行)的表上,mysql,Mysql,我想在下面的查询中返回SELECT语句检索到的行中非空值数量的计数。我注意到,当我对结果集为空的表执行查询时,$stmt->num_rows返回值1 我的完整代码如下所示: // initialize statement $stmt = $mysqli->stmt_init(); // prepare SQL query $sql = 'SELECT COUNT(vault_id) AS rows FROM vault WHERE
// initialize statement
$stmt = $mysqli->stmt_init();
// prepare SQL query
$sql = 'SELECT
COUNT(vault_id) AS rows
FROM
vault
WHERE
resource = ?';
if ($stmt->prepare($sql))
{
// bind the query parameter
$stmt->bind_param('s', $sanitizedpage);
// execute the query, and store the result
$stmt->execute();
$stmt->store_result();
}
// Return a count of the number of non-NULL values in the rows retrieved by a SELECT statement.//
if ($stmt->num_rows == 1)
{
echo $stmt->num_rows;
}
因此,上面SELECT查询语句中的num_rows()方法在对空表执行时返回值(1)
如果有帮助,请在我的表格结构下方找到:
`vault_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`resource` varchar(255) NOT NULL,
PRIMARY KEY (`vault_id`)
我需要你的建议来解决这个问题。 回答MySQL < /P>中的下表。
mysql> select * from test ;
Empty set (0.00 sec)
因此,此表中没有数据
现在让我们运行以下命令
mysql> select count(*) from test ;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
所以它返回1行,其中count(*)值为0
<>这是完全相同的情况,也就是说,当你运行计数(*)时,这个值可能是0,但是它总是返回一行,除非你已经使用了组来回答这个问题,请考虑MySQL < /P>中的下表。
mysql> select * from test ;
Empty set (0.00 sec)
因此,此表中没有数据
现在让我们运行以下命令
mysql> select count(*) from test ;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
所以它返回1行,其中count(*)值为0
因此,情况完全相同,这意味着当您运行count(*)时,该值可能为0,但它将始终返回一行,除非您使用了group by@Abnik是正确的,但是如果您希望保留应用程序逻辑并调整查询以使其正常工作,请改用此查询:
$sql = 'SELECT * FROM vault
WHERE resource = ?';
对于“未找到”条件,将不返回任何行;对于“已找到”,将返回“n”行
如果在找到资源时匹配行的数量很小,这将提供足够的性能(尽管不如计数好)。@Abnik是正确的,但是如果您希望保留应用程序逻辑并调整查询以使其正常工作,请改用此查询:
$sql = 'SELECT * FROM vault
WHERE resource = ?';
对于“未找到”条件,将不返回任何行;对于“已找到”,将返回“n”行
如果找到资源时匹配行的数量很小,这将提供足够的性能(尽管不如count好)。是的,结果中有一行包含count(可能是0)。您需要获取行并从中读取值。如果您选择了所有行并使用num_行,那么您的方法会起作用,但是您正确地认为这是一种愚蠢的方法。是的,结果中有一行带有计数(大概是0)。您需要获取行并从中读取值。如果您选择了所有行并使用num_行,那么您的方法会起作用,但正如您正确决定的那样,将GROUP BY子句添加到我的查询中是一种愚蠢的方法,正如Abhik所建议的那样,这样会产生所需的输出。因为我感兴趣的是行的数量,而不是值的数量,所以COUNT(expr)函数仍然是一个性能更好的选项。根据Abhik的建议,将GROUP BY子句添加到查询中会产生所需的输出。因为我感兴趣的是行的数量,而不是值的数量,所以COUNT(expr)函数仍然是一个性能更好的选项。