为什么mysql_num_rows在空表上为SELECT返回1?

时间:2013-03-03 23:44:14

标签: php mysql

代码:

 $review = mysql_query("SELECT conceptID, MIN(nextReview) FROM userconcepts WHERE userID='$userID'");
 $nrows = mysql_num_rows($review);
 echo "$nrows<br />\n";

当表具有此类条目并返回正确的列值时,查询将起作用。但是,当表为空时,正如我现在可以在HeidiSQL中确认的那样,mysql_num_rows仍然返回1,但列值为空。 (如果表具有不同userID的其他值,问题仍然存在。)

我希望这个查询有时会在正常操作期间返回空集,并且我想根据结果的存在采取行动,但我也想使用结果(如果存在)。知道为什么这段代码没有工作,因为我希望它工作(如果表是空的,我希望它返回0)?

2 个答案:

答案 0 :(得分:4)

首先,查询有一个非常简单的问题:您显示conceptID字段,但不显示它。如果要在SELECT上显示使用聚合函数的字段,则应显示该字段;不这样做是一个错误,并会使许多引擎不执行您的查询。

除此之外,只要你有一个聚合函数,并且你没有任何分组(即,不添加GROUP BY子句),结果就是一个行。无论表中的行数多少。

答案 1 :(得分:0)

原因是因为当SQL引擎执行仅包含聚合函数的查询时,它会返回一行。所以:

select count(*)
from table
where 1 = 2

将返回值为0的1行。这是所有SQL引擎的工作方式。

您的查询略有不同:

select conceptID, MIN(nextReview)
FROM userconcepts
WHERE userID='$userID'"

在大多数SQL方言中,您会收到来自“conceptID not in group by clause”或类似内容的错误。也就是说,查询会出现语法错误。

MySQL支持这一点。它将返回nextReview的最小值(来自符合where条件的行)以及conceptID的任意值(来自这些相同的行)。在这种情况下,没有行,因此值将设置为NULL

也许,你想要每conceptId行一行。该查询将是:

select conceptID, MIN(nextReview)
FROM userconcepts
WHERE userID='$userID'
group by conceptId