代码:
$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)?
答案 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