2013-03-03 56 views
2

代碼:爲什麼mysql_num_rows在空表上爲SELECT返回1?

$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,但列值爲空。 (如果表中有不同用戶標識的其他值,問題仍然存在)。

我希望這個查詢在正常操作期間有時會返回空集,並且我想根據結果的存在採取行動,但是如果它存在,我也想使用結果。任何想法爲什麼這個代碼不工作,因爲我期望它的工作(我希望它返回0,如果表是空的)?

+0

[**請不要在新代碼**中使用'mysql_ *'函數](http://bit.ly/phpmsql)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。 – Kermit 2013-03-03 23:48:09

+1

@AarolamaBluenk如何解決用戶的問題呢? – aaaaaa123456789 2013-03-03 23:48:44

+2

@ aaaaaa123456789這就是爲什麼它不是答案。 – poke 2013-03-03 23:49:19

回答

4

首先,查詢有一個非常簡單的問題:您顯示的是conceptID字段,但不是按它分組。如果你想在使用集合函數的SELECT上顯示一個字段,你應該顯示它;不這樣做是一個錯誤,並會使許多引擎不執行您的查詢。除此之外,無論何時你有一個聚合函數,並且你不按任何東西分組(即,不要添加一個GROUP BY子句),結果是一個行。無論表中的行數是多少。

+0

我不想找到每個conceptID的最小值。我不想找到每個用戶ID的最小值。我只想從行的nextID和nextReview中獲得固定用戶標識的最小nextReview。 你能否更詳細地解釋這個錯誤?什麼是適當的代碼使用? – user2129992 2013-03-03 23:59:21

+0

您發佈的查詢絕對不是那樣做的。您應該使用一個查詢獲取最小值,然後使用另一個查找nextReview是該值的概念ID。你可以在一個查詢中做到這一點,但它比它的價值更麻煩。 – aaaaaa123456789 2013-03-04 00:01:08

+0

代碼在有條目時有效。爲什麼搜索兩次?你能詳細說明如何更好嗎? – user2129992 2013-03-04 00:04:59

0

之所以這樣,是因爲當一個SQL引擎執行一個只有聚合函數的查詢時,它會返回一行。所以:

select count(*) 
from table 
where 1 = 2 

將返回1行,值爲0.這是所有SQL引擎工作的方式。

您的查詢有一點不同:

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

在大多數SQL方言,你會從「conceptID不是在GROUP BY子句中」或類似的東西得到的一個錯誤。也就是說,查詢會有語法錯誤。

MySQL支持這個。它將返回最小值nextReview(來自符合where條件的行)以及任意值conceptID(來自同一行)。在這種情況下,沒有行,所以這些值將被設置爲NULL

也許,你想要每行conceptId一行。該查詢將是:

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

每行(使用固定的用戶標識)都有一個唯一的概念標識。通過conceptID進行分組將毫無意義。 – user2129992 2013-03-04 00:12:19