我想在下面的查询中返回SELECT语句检索到的行中非NULL值的数量。我注意到当我在一个空结果集的表上执行查询时,$ stmt-> num_rows返回值为1。
我的完整代码如下所示:
// 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`)
我需要你的建议来解决这个问题。
答案 0 :(得分:4)
要回答这个问题,请考虑mysql中的下表
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
答案 1 :(得分:0)
@Abnik是正确的,但是如果您想保留您的应用逻辑并调整查询以使其正常工作,请改用此查询:
$sql = 'SELECT * FROM vault
WHERE resource = ?';
这将不会返回“未找到”条件的行,并且“n”行不会返回“找到”。
如果找到资源时匹配行的数量很少,这将提供足够的性能(尽管不如计数)。