2010-12-14 76 views
0

我在我的網站上列出了一大堆產品,每個產品都有用戶評分。我使用一個查詢爲每個產品提取一些數據點(「詳細查詢」),第二個查詢返回每個產品的平均用戶評級(「評級查詢」)。在PHP中排序MySQL結果...?

我想將每個產品的用戶評分附加到「詳細查詢」結果集上,然後按降序排列。我讀過堆棧溢出,php.net等一堆條目,我想我需要使用usort()與自定義函數,但每次我將我的MySQL結果傳遞給usort()我得到一個PHP錯誤說:我傳遞給usort()的對象不是數組。例如,我試過了:

$data = mysql_fetch_array($details_query); 
usort($data,"compare"); 

這樣做會引發錯誤,說$ data不是數組。我究竟做錯了什麼?

此外,如果任何人有任何其他建議如何完成這件事,我會非常感激。由於某種原因,我遇到了這樣的困難...

謝謝!

+3

在查詢中執行此操作。這是最簡單的方法。也許問一個關於如何做的單獨問題,包括關於表結構的更多細節 – 2010-12-14 03:28:58

+1

實際上幾乎沒有理由在PHP中對數據庫數據進行排序。在幾乎每種情況下,SQL都可以更快地完成。 – Jonah 2010-12-14 03:30:53

+0

嗨Pekka,因爲我的表結構的方式,我不認爲我可以在查詢內做到這一點。 「詳細信息查詢」根據國家/地區提取個人記錄,「評級查詢」在各個國家/地區進行彙總。我很清楚我必須在php中進行排序後查詢。 – Chris 2010-12-14 03:31:47

回答

4

你不當使用MySQL功能 - mysql_fetch_array並不需要一個SQL查詢,它需要一個MySQL結果資源:

http://php.net/manual/en/function.mysql-fetch-array.php

所以,你想是這樣的:

$all_data = array(); 

$sql = "SELECT blah FROM blah"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 
    $all_data[] = $row; 
} 

// $all_data is now a 2-D array with all your data. 
usort($all_data, "compare"); 
0

你試過輸出$ data數組,所以你可以用print_r()看到它嗎?聽起來像$數據可能是空的,因此不是一個數組。如果是這種情況,則結果集爲空,或者查詢存在問題。

1

mysql_fetch_array從數據庫結果集中檢索單個行爲索引和關聯數組。

它不會給你一個包含結果集中每一行的數組。你仍然需要循環得到的所有行:

while ($row = mysql_fetch_array($details_query)) { 
    $data[] = $row; 
} 

現在你可以定義和使用比較函數由$每個條目數據的等級屬性,或任何你需要做的排序。

3

我會在SQL查詢中做到這一點。

SELECT foo,bar,baz 
FROM MyTable 
ORDER BY bar DESC 

你可以把與你的PHP排序後場「ORDER BY」,並添加取決於你要排序什麼方式ASC或DESC。

$SQL = "SELECT foo,bar,baz FROM MyTable ORDER BY ".$SortField." DESC"; 

讓SQL服務器爲你做盡可能多的:d

0

這應該在你的MySQL SELECT語句來完成。如果它跨越多個表格,則使用JOIN將所有數據合併爲一個結果,並根據需要對其進行分類。

+0

我不確定我能做到這一點。我通過「評級查詢」獲得的平均用戶評分在所有國家和搜索類型的產品的所有評論中彙總。 「詳細信息查詢」根據用戶的國家和其他參數提取特定鏈接,因此我認爲我無法將所有內容都彙總成單個結果。我想我必須運行兩個查詢,然後依次排序。不知道該怎麼做... – Chris 2010-12-14 05:12:17

0

在填充$data數組(根據Dan Grossman或beamrider9的指示)之後,您可以使用自定義回調函數,例如:

function compare($a, $b) 
{ 
    // Assuming you're sorting on bar field 
    return strcmp($a['bar'], $b['bar']); 
} 

但正如很多人所說的,在數據​​庫端(使用ORDER BY)而不是在您的PHP代碼中進行評論。

此外,如果您使用mysql_fetch_array($details_query, MYSQL_ASSOC),您會得到更好的結果。 PHP有一個奇妙的功能叫做print_r()。廣泛使用它來調試你的代碼。