Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql count(expr)返回';1';在结果集为空(即零行)的表上_Mysql - Fatal编程技术网

Mysql count(expr)返回';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

我想在下面的查询中返回SELECT语句检索到的行中非空值数量的计数。我注意到,当我对结果集为空的表执行查询时,$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`)

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

回答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)函数仍然是一个性能更好的选项。