2014-03-31 79 views
0

我一直在使用這個命令來檢索具有相同的電子郵件地址字段的號碼:問題與SELECT COUNT(ID)

$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email`='$email'") or die($db-error); 

有3條記錄users表相同的電子郵件地址。問題是當我把*而不是COUNT(user_id)它正確地返回:$query->num_rows給3,但是當我使用COUNT(user_id)然後$query->num_rows時,返回1。我該如何糾正這個問題或我的問題在哪裏?

+2

可以將user_id設置爲NULL嗎? – Alfons

+0

你有沒有試過'COUNT(*)'? – aurbano

+1

@Chevi我認爲它也被提及:-) – ponciste

回答

-1

這是正確的行爲:如果使用COUNT函數,則選擇查詢的結果將只是一行,其中一列包含數據集的數量。

所以,你可以檢索用戶與給定的E-mail地址這樣的數字:

$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email`='$email'") or die($db-error); 
$row = $query->fetch_row(); 
$count = $row[0]; 

注意,這比使用SELECT *查詢所有數據,並檢查$query->num_rows,因爲它並不需要更快實際獲取數據。

+0

謝謝。那是對的。我正在尋找一個相同的號碼。雖然我沒有明白你的觀點,但由於你的建議,我開始研究一些功能,以真正瞭解他們基本的工作原理和原理。我花了3個小時才知道你在說什麼,但現在我明白了。它只返回一行。我用fetch_row()獲取行,然後查看第一個索引值[0]。價值3完全符合我的期望。 – EhsanSia

0

當您在該查詢中使用$query->num_rows時,它將僅返回1行,因爲只有一個計數返回。

實際的行數將包含在該查詢中。如果你想要的結果作爲對象,或者關聯數組給數名:

$query = $db->query("SELECT COUNT(`user_id`) AS total FROM `users` WHERE `email`='$email'") or die($db-error); 

並在返回的查詢total應該是3,而$query->num_rows仍將1.如果你只是想值快速方式將使用$total = $query->fetchColumn();

正如其他人雖然說,要小心NULL用戶ID,因爲COUNT()會忽略它們。

0
  1. 電子郵件必須是用戶表中的uinque。因此,你根本不需要計數。
  2. 你應該使用預處理語句。
  3. 你不應該發佈永遠不會運行的代碼。

這裏去運行這樣一個查詢的唯一正確途徑。

$sql = "SELECT * FROM `users` WHERE `email`=?"; 
$stm = $db->prepare($sql); 
$stm->execute([$email]); 
$user = $stm-fetch(); 

(代碼被寫入由於錯誤標記爲mysqli的就需要使用其他代碼,但指導方針仍然是相同。)

像這樣的事情

$sql = "SELECT * FROM `users` WHERE `email`=?"; 
$stm = $db->prepare($sql); 
$stm->bind_param('s',$email); 
$stm->execute(); 
$res = $stm->get_result() 
$user = $res->fetch_assoc(); 

$user變量中,您將在下面的代碼中使用您需要的userdata或false,這意味着找不到用戶。因此$user可以在if()聲明中使用,不需要任何計數。

如果您確實需要對行進行計數,則使用您嘗試使用的count()方法。您可以使用this answer中的函數:

$count = getVar("SELECT COUNT(1) FROM users WHERE salary > ?", $salary); 
+0

我假設你低估了我們的答案 –

+0

如果他的'email'字段(由於某種原因)不是唯一的,爲什麼他不應該計算他所重複的電子郵件的數量? – aurbano

+0

@Chevi這樣的一個原因只是不退出。用戶表顯然必須是唯一的。無論哪種方式,你必須質疑操作,而不是我。 –