2013-07-16 30 views
1

我想列出在我的MySql數據庫中最常出現的前3名。根據出現次數顯示數據MYSQL

這是我用來做什麼:

 $nameQuery = "SELECT PeopleName, COUNT(*) AS totalNumber FROM finaldb ORDER BY  COUNT(PeopleName) LIMIT 5"; 
     $nameResult = mysql_query($nameQuery); 
     while($data = mysql_fetch_array($nameResult)) { 

       $name = $data['totalNumber']; 
     } 

echo $name; 

然而,這似乎並沒有工作。有什麼建議麼?

我的數據庫包含:PeopleName,ID並稱爲finaldb。

+0

*必須:*本'mysql_ *'功能的[棄用PHP 5.5](http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated) 。不建議您編寫新的代碼,因爲這會阻止您將來升級。相反,請使用[MySQLi](http://php.net/manual/en/book.mysqli.php)或[PDO](http://php.net/manual/en/book.pdo.php)和[是一個更好的PHP開發人員](http://jason.pureconcepts.net/2012/08/better-php-developer/)。 –

+0

如果它不起作用 - 它有什麼作用?崩潰?提供錯誤訊息?返回錯誤的數據?返回正確的數據,但不是全部? – andrewsi

+0

@andrewsi只是不返回任何東西。 – qweqweqwe

回答

1

您應該返回1結果與該查詢,但就是這樣。您需要BY子句將組添加到您的SQL:

SELECT PeopleName, COUNT(PeopleName) AS totalNumber FROM finaldb GROUP BY PeopleName ORDER BY COUNT(PeopleName) DESC LIMIT 5 

您還可以查看您的查詢應該由mysql命令行中運行,或phpMyAdmin的內部回報什麼。

您的循環僅將最新的totalNumber分配給$ name。如果你想呼應的所有數據,試試這個:

while($data = mysql_fetch_array($nameResult)) { 

      echo "{$data['PeopleName']} - {$data['totalNumber']}\n"; 
    } 

對於添加數據,只是不斷增加的列名:

  echo "{$data['PeopleName']} - {$data['totalNumber']} - {$data['Gender']} - {$data['Age']}\n"; 
+0

,它返回一個物理數量但不是數據本身。 – qweqweqwe

+0

它是什麼回來,你在找什麼?它應該返回類似於'John 10 James 8 Robert 7' – aynber

+0

當然,您只將totalNumber分配給$ name,所以當您回顯$ name時,您只會從循環中獲取最後一個totalNumber。 – aynber

1
SELECT 
    PeopleName 
    count(PeopleName) 
FROM 
    finalDB 
GROUP BY 
    PeopleName 
ORDER BY 
    count(PeopleName) DESC 
LIMIT 0,3 
2

你缺少GROUP BY,嘗試此查詢:

$nameQuery = "SELECT PeopleName, COUNT(PeopleName) AS totalNumber FROM finaldb GROUP BY PeopleName ORDER BY  COUNT(PeopleName) LIMIT 5"; 
+0

返回一個物理數量但不是數據本身 – qweqweqwe

1

您的循環不保留您拔出的名稱,它只是將PREVIOUS名稱覆蓋下一個值。你需要建立一個值的數組,或者至少在循環中做你的輸出。例如

$names = array(); 
while(...) { 
    $names[] = array('name' => $data['PeopleName'], 'total' => $data['totalNumber']); 
} 
var_dump($names);