2010-12-14 10 views
0

J'ai une page sur mon site qui énumère un tas de produits, chacun avec une note d'utilisateur. J'utilise une requête pour extraire des points de données pour chaque produit («requête de détails») et une seconde requête qui renvoie la note moyenne de chaque produit («requête de classification»).Tri des résultats de MySQL en PHP ...?

Je souhaite ajouter la note de l'utilisateur pour chaque produit dans le jeu de résultats "Requête de détails", puis trier par classement dans l'ordre décroissant. J'ai lu un tas d'entrées sur Stack Overflow, php.net etc. et je pense que je dois utiliser usort() avec une fonction personnalisée, mais chaque fois que je passe mon résultat MySQL à usort(), je reçois une erreur php disant l'objet que je passe à usort() n'est pas un tableau. Par exemple, j'ai essayé:

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

L'exécution de ce qui précède entraînera une erreur indiquant que $ data n'est pas un tableau. Qu'est-ce que je fais mal?

Aussi, si quelqu'un a d'autres suggestions sur la façon d'y arriver, je serais vraiment reconnaissant. Je vais avoir un moment vraiment difficile avec cela pour une raison quelconque ...

Merci!

+3

Faites ceci dans la requête. C'est le moyen le plus simple. Peut-être poser une question distincte sur la façon de faire cela, y compris plus de détails sur la structure de la table –

+1

Il n'y a vraiment presque jamais de raison de trier les données de la base de données en PHP. Dans presque tous les cas, cela peut être fait beaucoup plus rapidement en SQL. – Jonah

+0

Salut Pekka, à cause de la structure de mes tables, je ne pense pas que je puisse le faire dans une requête. La "requête de détails" extrait les enregistrements individuels en fonction du pays et la "requête de classement" est agrégée entre les pays. Je suis sûr que je dois faire le tri post-requête en php. – Chris

Répondre

4

Vous êtes mal à l'aide des fonctions MySQL - mysql_fetch_array ne prend pas une requête SQL, il faut une ressource de résultat MySQL:

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

Vous voulez quelque chose comme:

$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

Avez-vous essayé de sortir le tableau de données $ afin de pouvoir le voir avec print_r()? On dirait que $ data peut être vide, donc pas un tableau. Si c'est le cas, soit le jeu de résultats est vide, soit il y a un problème avec votre requête.

1

mysql_fetch_array récupère une seule rangée à partir du résultat de la base de données établie dans un tableau indexé et associatif.

Il ne vous donne pas un tableau contenant chaque ligne dans le jeu de résultats. Vous avez encore besoin de boucle pour obtenir toutes les lignes:

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

Maintenant, vous pouvez définir et utiliser votre fonction de comparaison pour trier par chaque entrée de la propriété de notation de données $, ou tout ce que vous devez faire.

3

Je l'aurais fait dans la requête SQL.

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

Vous pouvez mettre dans votre champ de tri avec PHP après « ORDER BY » et ajouter ASC ou DESC en fonction de quelle façon vous voulez trier.

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

Que le serveur SQL faire autant que possible pour vous: D

0

Cela devrait être fait dans votre instruction select MySQL. Si vous utilisez plusieurs tables, utilisez JOINs pour combiner toutes les données en un seul résultat et le trier en fonction de vos besoins.

+0

Je ne suis pas sûr de pouvoir le faire. La note d'utilisateur moyenne que j'obtiens à partir de la «note d'évaluation» est agrégée pour tous les avis concernant le produit dans tous les pays et types de recherche. "Requête Détails" tire un lien spécifique basé sur le pays de l'utilisateur et d'autres paramètres, donc je ne pense pas que je peux tout obtenir dans un seul résultat. Je pense que je devrais exécuter deux requêtes, puis trier l'un par l'autre. Je ne sais pas comment faire ça non plus ... – Chris

0

Après avoir rempli le tableau $data (comme indiqué par Dan Grossman ou beamrider9), vous pouvez utiliser votre fonction de rappel personnalisée comme:

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

Mais comme beaucoup l'ont commenté, faites-le dans la fin de la base de données (en utilisant ORDER BY) plutôt que dans votre code PHP.

Aussi si vous utilisez mysql_fetch_array($details_query, MYSQL_ASSOC), vous obtiendrez un meilleur résultat. PHP a une fonction fantastique appelée print_r(). Utilisez-le largement pour déboguer votre code.

Questions connexes