SELECT IN et ordre tri

Eléphanteau du PHP | 42 Messages

03 nov. 2007, 21:24

Bonjouir

Je suis coincé avec la focntion SELECT ... IN
L'ordre des valeurs entre parenthèses n'est pas conservée quand je traite le résultat de la requête.

Voilà ma fonction :

Code : Tout sélectionner

$req=mysql_query("SELECT * FROM produits WHERE produit_id IN (512,250,450)"); while ($data=mysql_fetch_array($req)) { echo ($data["produit_id"].','); }
Résultat : 250,450,512,

Or je voudrais que ça garde l'ordre de traitement initial à savoir 512, 250, 450

Que dois-je rejouter dans ma requête ?

Merci beaucoup

@+
Fabien

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

03 nov. 2007, 22:47

Salut,
Que dois-je rejouter dans ma requête ?
Un tri sur un champ "ordre" que tu ajoutes à la table pour pouvoir sortir les résultats dans l'ordre que tu veux.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 42 Messages

03 nov. 2007, 23:56

Merci mais ça ne résoud pas mon problème

Je m'explique :

En fait la série (512,250,450) est le résultat d'un tirage et je veux que quand j'affiche le détail de chacun de ses produits par mysql_fetch_array l'ordre soit conservé or là par défaut la requête classe par produit_id croissant.

Fabien

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

04 nov. 2007, 01:19

Oui mais tu vois une suite logique dans "512,250,450" ?

soit tu fais 3 requêtes séparées avec une clause where sur l'id
soit une requête avec union et les restrictions sur l'id
soit tu exécutes la requête comme tu présentes, tu boucles sur le résultat en récupérant dans un tableau indexé avec les id. ex:
$tab = array();
while ($data=mysql_fetch_array($req))
{
    $id = $data["produit_id"];
    $tab["$id"] = $data;
}

print_r($tab);

// la tu peux accéder aux éléments dans l'odre que tu souhaites
echo $tab[512]["produit_id"];

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

04 nov. 2007, 01:22

Peut-être qu'en rangeant le résultat de ta requête dans un tableau tu pourrais obtenir l'ordre de tri souhaité :
// On initialise la variable $tab avec un tableau vide
$tab = array();
// On initialise la variable $data avec une chaîne vide
$data = "";

// On range chaque élément de la requête dans le tableau $tab
while ($elem = mysql_fetch_assoc($req)) {
$tab[$data] = $elem['produit_id'];
}

// On affiche chaque élément du tableau
foreach ($tab as $data => $val) {
echo $data;
}
Je ne suis pas certain du résultat produit par ce code... Reste plus qu'à tester.

Une autre solution serait peut-être d'ajouter une clause ORDER BY dans ta requête, seulement je ne vois pas comment formuler ça en gardant l'ordre défini par la clause IN (si tant est que cela soit possible). :?

Eléphant du PHP | 445 Messages

04 nov. 2007, 01:37

Cela devrais fonctionner comme cela.

Code : Tout sélectionner

SELECT * FROM produits WHERE produit_id=512 UNION ALL SELECT * FROM produits WHERE produit_id=250 UNION ALL SELECT * FROM produits WHERE produit_id=450

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

04 nov. 2007, 01:50

Pouah les pti's d'jeunz
Pas assez rapide :lol:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 185 Messages

04 nov. 2007, 02:00

Il faut dire que les problèmes des "fous de minuit" (caste à laquelle je dois certainement appartenir), qui réfléchissent encore au PHP à cette heure indécente, me permettent dans bien des cas d'en apprendre encore... Mais cela n'est pas sans entraîner à chaque fois une profonde reflexion, ce qui n'est certainement pas le cas des vétérans, sachant répondre à (presque) tout du tac au tac ! :D

Ahem... Et si on recentrait le débat sur le sujet du topic, hein ? :wink:

ps : j'apprécie néanmoins le "pti's d'jeunz", voilà qui me rajeunit... Si seulement mes cellules grises pouvaient suivre ! :P

Eléphant du PHP | 445 Messages

04 nov. 2007, 02:11

Pouah les pti's d'jeunz
Pas assez rapide :lol:
Ah et ces vieux qui considerent le rang phpBB comme signe de vieillesse.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

04 nov. 2007, 06:55

En fait il existe une quatrième solution, basée sur la fonction FIELD(), qui peut être utilisée de la sorte :

Code : Tout sélectionner

SELECT * FROM produits WHERE produit_id IN (512,250,450) ORDER BY FIELD(produit_id, 512, 250, 450)

Eléphanteau du PHP | 42 Messages

12 nov. 2007, 15:40

Whaou !!!

Merci mille fois Hubert (et aux autres) !

Ca faisait très longtemps que je cherchais cette solution !

Fabien