2

编码:

 $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,但列值为空。(如果表具有不同用户 ID 的其他值,问题仍然存在)。

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

4

2 回答 2

4

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

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

于 2013-03-03T23:46:52.713 回答
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 子句”或类似内容的错误。也就是说,查询将有语法错误。

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

也许,您希望每conceptId. 该查询将是:

select conceptID, MIN(nextReview)
FROM userconcepts
WHERE userID='$userID'
group by conceptId
于 2013-03-03T23:58:29.383 回答