Ordre des id dans le SELECT non pris en compte dans le WHILE [Résolu]

Signaler
Messages postés
166
Date d'inscription
mercredi 27 juin 2007
Statut
Membre
Dernière intervention
31 mars 2014
-
Messages postés
166
Date d'inscription
mercredi 27 juin 2007
Statut
Membre
Dernière intervention
31 mars 2014
-
Bonjour à tous,

j'ai une requête toute simple du genre:

$sql="SELECT pseudo,avatar FROM membres WHERE membre_id IN ('".$Ris[0]."','".$Ris[1]."','".$Ris[2]."')";
$result= mysql_query($sql) or die('');

J'en extrais le résultat comme ceci:

while ($Res = mysql_fetch_row($result) ){

$biz.="

".$Res[0]."
";
}

Mon problème est que les id précisés dans la 1ère requête ne sont pas forcément classés dans un quelconque ordre numérique alors que le while me les rends ordonnée du plus petit au plus grand. Pour obtenir ce que je veux (garder le même ordre d'entrée que dans le SELECT) je suis obligé d'utiliser le système D.

N'existe-t-il pas un moyen de forcer le while à me rendre les données dans le même ordre que celui de la requête SELECT ?

Merci d'avance



Signé Sagat

12 réponses

Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
45
Je t'apporte une légère amélioration de ton code
for($i = 1; $i < 4; $i++) {
$sql = "SELECT ct.ligne_id, ct.membre".$i.", ct.score".$i." 
ms.membre_id, ms.pseudo, ms.avatar 
FROM classement ct 
INNER JOIN membres ms
ON ct.membre".$i." = ms.membre_id 
WHERE ct.ligne_id = 'XXX'";
$query = mysql_query($sql) or die( mysql_error() );
while($row = mysql_fetch_row($query)) '
....
}
}

Je pense qu'elle te conviendra.




______________________________________________________________________
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
45
Pour désigner l'ordre d'affichage d'une requête il faut utiliser la clause sql ORDER BY.

______________________________________________________________________
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
$sql = "SELECT pseudo, avatar FROM membres WHERE membre_id IN ('{$Ris[0]}','{$Ris[1]}','{$Ris[2]}') ORDER BY membre_id;"; 


VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
166
Date d'inscription
mercredi 27 juin 2007
Statut
Membre
Dernière intervention
31 mars 2014
1
Désolé, mes aucunes de vos méthodes ne fonctionne.

La débrouille me permet d'obtenir ce que je souhaite.

@phpAnonyme: j'obtiens les valeurs de Ris[] par une requête utilisant la clause ORDER BY sur un champs donné. Cette première requête me renvoie des id de membres qui eux n'ont aucun ordre particulier.

Mon problème est que le while me donne bien les infos correspondantes mais pas forcément dans le bon ordre.


Signé Sagat
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
45
Le While n'a rien à voir dedans.
Fais voir ta requête avec le ORDER BY


______________________________________________________________________
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
45
N'existe-t-il pas un moyen de forcer le while à me rendre les données dans le même ordre que celui de la requête SELECT ?

Petite précision par défaut le SELECT renvoie les données tel qu'il les à trouver.

______________________________________________________________________
Messages postés
166
Date d'inscription
mercredi 27 juin 2007
Statut
Membre
Dernière intervention
31 mars 2014
1
Salut,

j'ai une tâche Cron qui rempli correctement une table donnée.

Pour obtenir mes infos, j'utilise les requêtes suivantes:

$sql="SELECT membre_id1,membre_id2,membre_id3,score1,score2,score3 FROM matable WHERE ligne_id='xxx'";
$result=mysql_query($sql) or die();
$Ris=mysql_fetch_row($result);

$sql1= "SELECT membre_id,pseudo,avatar FROM membres WHERE membre_id IN ('".$Ris[0]."','".$Ris[1]."','".$Ris[2]."')";
$result1= mysql_query($sql1) or die('Echec 1');

Avec score1 > score 2 > score 3

En faisant un tableau (membre_idX,scoreX) j'en déduis l'ordre souhaité

Sinon le Order By était dans la tâche cron.

Signé Sagat
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
45
j'ai une tâche Cron qui rempli correctement une table donnée.

Sinon le Order By était dans la tâche cron.

Si la tâche cron sert à insérer des données je ne vois pas pourquoi tu utilise un ORDER BY dedans.
Néanmoins, au cas où tu ne le saurais pas ou que tu n'ai pas fais de recherche dessus si tu ne définit pas l'ordre de sortie(croissant ou décroissant) souhaité dans la clause, par défaut l'ordre est croissant(si je me souviens bien)

SELECT membre_id1,membre_id2,membre_id3,score1,score2,score3 FROM matable WHERE ligne_id='xxx'

J'ai du mal à saisir, la structure de cette table, voir de l'autre également. N'est ce pas un seul membre qui effectue les scores 1, 2 et 3?

Pour aller vite et de manière simple il faut me détailler le fonctionnement de tes tables et ce que tu cherche à faire.
- Que souhaite tu afficher ?
- Dans quel ordre ?
- A quoi correspond les champs : membre_id1,membre_id2,membre_id3 ?
Ton membre à plusieurs ID ?

Voilà.

______________________________________________________________________
Messages postés
166
Date d'inscription
mercredi 27 juin 2007
Statut
Membre
Dernière intervention
31 mars 2014
1
Re,

1 table membres: membre_id, pseudo, avatar
1 table classement: ligne_id (identifiant du jeu), 3 meilleurs membres avec leur score respectifs (membre_id1, membre_id2, membre_id3, score1,..)

Ma tâche cron cherche le membre_id et le score des 3 meilleurs membres pour chaque jeu, et inscrit les résultats dans la table classement. Un simple SELECT sur cette table me permet de connaitre le trio de tête.


J'aurai pû faire une table classement avec plusieurs lignes par jeu, cela m'aurait permis de faire directement un seul Select sur 2 tables et de tout obtenir dans l'ordre. L'idée aurait put être:

ligne_id, top1, membre_id, score
ligne_id, top2, membre_id, score.....

Mais j'ai préféré utiliser 1 seule ligne par jeu. Un simple système D me permet d'obtenir ce que je désire. Donc je postais pour savoir s'il existait une manière de sortir les données d'un SELECT non pas dans l'ordre trouvé mais dans un ordre prédéfini et quelconque à la fois (celui inscrit dans la clause IN)

Merci encore de te soucier de mon problème, et s'il n'y a pas d'autres solutions que de modifier la structure de mes tables, je continuerai d'utiliser la débrouille comme rescousse


Signé Sagat
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
45
Non tu ne peut effectivement pas. Pas directement en tout cas, i.e système D comme tu dis.

Le choix que tu as pris n'est effectivement pas la meilleure pour ce que tu veux en faire.

______________________________________________________________________
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
45
ct.membre_id".$i." sur la 2ème et 6eme ligne


______________________________________________________________________
Messages postés
166
Date d'inscription
mercredi 27 juin 2007
Statut
Membre
Dernière intervention
31 mars 2014
1
Je te remercie, c'est effectivement bien plus propre que mon système D et sans toucher la structure de mes tables.

Je regrette même de pas y avoir penser tout seul ^^

Merci encore


Signé Sagat