count(expr)在具有空结果集的表(即零行)上返回计数“1”

时间:2014-06-03 20:32:36

标签: mysql

我想在下面的查询中返回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`)

我需要你的建议来解决这个问题。

2 个答案:

答案 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”行不会返回“找到”。

如果找到资源时匹配行的数量很少,这将提供足够的性能(尽管不如计数)。