2010-12-14 21 views
0

私は自分のサイトにユーザー評価のある多数の製品をリストしたページを持っています。 1つのクエリを使用して、各製品のデータポイント(詳細クエリ)と、各製品の平均ユーザー評価(「評価クエリ」)を返す2つ目のクエリを取得します。PHPのMySQL結果のソート...?

「詳細クエリ」の結果セットに各製品のユーザー評価を追加し、降順で評価してソートします。私はスタックオーバーフロー、php.netなどの項目を読んだことがあります。私はカスタム関数でusort()を使う必要があると思いますが、私のMySQL結果をusort()に渡すたびにPHPエラーが表示されます私がusort()に渡しているオブジェクトは配列ではありません。たとえば、私は試しました:

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

上記を実行すると、$ dataは配列ではないというエラーが表示されます。私は間違って何をしていますか?

また、これを行う方法に関する他の提案がある場合は、本当に感謝します。私は何らかの理由でこれで本当に苦労しています...

ありがとう!

+3

これはクエリで行います。それは最も簡単な方法です。おそらく、テーブル構造に関する詳細を含めて、それを行う方法に関する別の質問をしてください。 –

+1

PHPでデータベースデータをソートする理由はほとんどありません。すべてのケースで、SQLでもっと速く実行できます。 – Jonah

+0

こんにちはPekka、私のテーブルが構成されている方法のため、私はクエリ内でこれを行うことはできないと思います。 「詳細クエリ」は国に基づいて個々のレコードを抽出し、「評価クエリ」は国々で集計されます。私はPHPでソート後のクエリをしなければならないと確信しています。 – Chris

答えて

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

print_r()で$ data配列を出力しようとしましたか? $ dataのような音は空であるかもしれないので、配列ではありません。その場合、結果セットが空であるか、クエリに問題があります。

1

mysql_fetch_arrayは、データベースの結果セットからインデックス付き連想配列に1行を取り出します。

結果セットのすべての行を含む配列を提供するわけではありません。あなたはまだすべての行を取得するためにループする必要があります。

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

今あなたが定義し、$データの評価プロパティの各エントリでソートするためにあなたの比較関数を使用するか、またはあなたがする必要があるものは何でもすることができます。

3

私はこれをSQLクエリで行いました。

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

あなたは「BY ORDER」の後にPHPを使用して並べ替えフィールドに配置し、ソートしたいどのような方法によって、ASCまたはDESCを追加することができます。

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

SQLサーバーがあなたのためにできるだけ多くのことをやってみましょう:

0

これはあなたのMySQLのSELECT文で行われるべきであるD。複数の表にまたがっている場合は、JOINを使用してすべてのデータを1つの結果にまとめ、必要に応じてソートします。 -

+0

私はこれを行うことができるか分からない。 「評価クエリ」から取得したユーザーの平均評価は、すべての国と検索タイプの製品のすべてのレビューで集計されます。 「詳細クエリ」では、ユーザーの国やその他のパラメータに基づいて特定のリンクが取得されるため、すべてを単一の結果にすることはできません。私は2つのクエリを実行し、次に別のクエリを実行しなければならないと思います。それをどうやって行うかわからない... – Chris

0

$data配列を(Dan Grossmanまたはbeamrider9の指示に従って)埋め込んだ後、次のようなカスタムコールバック関数を使用できます。

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

しかし、多くの人がコメントしたように、PHPコードではなくデータベースの最後(ORDER BYを使用)で実行します。

また、mysql_fetch_array($details_query, MYSQL_ASSOC)を使用すると、より良い結果が得られます。 PHPにはprint_r()という素晴らしい機能があります。コードをデバッグするために広範囲に使用してください。