Page 1 sur 1
SELECT IN et ordre tri
Posté : 03 nov. 2007, 21:24
par Jeaf16
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
Re: SELECT IN et ordre tri
Posté : 03 nov. 2007, 22:47
par Truc
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.
Posté : 03 nov. 2007, 23:56
par Jeaf16
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
Posté : 04 nov. 2007, 01:19
par Truc
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"];
Posté : 04 nov. 2007, 01:22
par Kaoteknik
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).

Posté : 04 nov. 2007, 01:37
par h0_noMan
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
Posté : 04 nov. 2007, 01:50
par Truc
Pouah les pti's d'jeunz
Pas assez rapide

Posté : 04 nov. 2007, 02:00
par Kaoteknik
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 !
Ahem... Et si on recentrait le débat sur le sujet du topic, hein ?
ps : j'apprécie néanmoins le "pti's d'jeunz", voilà qui me rajeunit... Si seulement mes cellules grises pouvaient suivre !

Posté : 04 nov. 2007, 02:11
par h0_noMan
Pouah les pti's d'jeunz
Pas assez rapide

Ah et ces vieux qui considerent le rang phpBB comme signe de vieillesse.
Posté : 04 nov. 2007, 06:55
par Hubert Roksor
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)
Posté : 12 nov. 2007, 15:40
par Jeaf16
Whaou !!!
Merci mille fois Hubert (et aux autres) !
Ca faisait très longtemps que je cherchais cette solution !
Fabien