Problème de tri de résultat

nagrom13 Messages postés 4 Date d'inscription vendredi 22 janvier 2010 Statut Membre Dernière intervention 30 octobre 2010 - 24 oct. 2010 à 14:26
yexbe Messages postés 8 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 31 octobre 2010 - 30 oct. 2010 à 22:00
Bonjour,
Je vais essayer d'expliquer clairement mon problème.

Je fais une requete sur une table pour récupérer des infos et je veux afficher le résultat sous forme de tableau. Jusque la pas de problème.
Il se trouve que dans la table différentes données sont stockées sous forme d'une concaténation séparée par des guillemets. En gros j'aurais aimé faire un tri des résultats sur un des éléments de cette concaténation.

Exemple :

while($row = mysql_fetch_row($result)){
$userid = $row[0];
$username = $row[1];
$time = $row[2];
$sdata = $row[3];
$arr_data = explode('"', $sdata);
}

en fait sdata est de la forme a:5:{i:55;s:5:"Paris";i:62;s:7:"Toronto";i:57;s:15:"6 February 2011"}

Ensuite dans mon while je fais :
echo '<tr class="resultat">
<th class="id">'.$row[0].'</th>
<th class="pseudo">'.$row[1].'</th>
<th class="provenance">'.$arr_data[1].'</th>
<th class="destination">'.$arr_data[3].'</th>
<th class="date_depart">'.$arr_data[5].'</th>
</tr>';

Mais j'aimerai que le tableau soit trier en fonction de date_depart. Si date_depart avait été une colonne de ma table j'aurai fait un simple order by date_depart dans ma requete mais la je ne peux pas.

Quelqu'un pourrait il éclairé ma lanterne ?

Merci

8 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
24 oct. 2010 à 14:59
Salut,

Avant d'aller plus loin tu devrais revoir la structure de ta base de donnée, stocker ses donnés dans un varchar (ou autre) dans un format spécial pour ensuite interpréter ce format est franchement immonde. On y perd tout l'intéret des bases de données, il ne faux jamais faire ça, et c'est malheureusement une erreur assez classique chez les débutants. Afin de t'aider à refaire ta base de donnée je te recommande cet article que j'ai écrit : Des bases de données relationnelles et multivaluées.
0
nagrom13 Messages postés 4 Date d'inscription vendredi 22 janvier 2010 Statut Membre Dernière intervention 30 octobre 2010
24 oct. 2010 à 15:04
Entièrement d'accord avec toi, c'est tout simplement immonde. Je bosse néanmoins sur un existant.
Je suis beaucoup plus analyste que programmeur et voir de telles choses n'est jamais très plaisant :)
Evidemment si j'avais la main sur tout j'aurai vite modifié tout ça ;)
Malheureusement on doit quelque fois bosser avec ce qu'on nous donne ^^

Merci pour le lien ;)
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
24 oct. 2010 à 15:35
T'as vraiment pas de chance toi :/

Donc pour ton tri de tableau, tout est là : Tri des tableaux.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
24 oct. 2010 à 21:40
Salut,

Juste comme ça : sdata est un tableau linearisé, avec serialize() . Pour le délinéariser : unserialize(). C'est un peu mieux que explode(), ça permet surtout de récupérer tout le tableau.
Je sais pas si c'est utile ou pas...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nagrom13 Messages postés 4 Date d'inscription vendredi 22 janvier 2010 Statut Membre Dernière intervention 30 octobre 2010
25 oct. 2010 à 16:41
Merci a vous deux je vais me repencher dessus ;)
0
nagrom13 Messages postés 4 Date d'inscription vendredi 22 janvier 2010 Statut Membre Dernière intervention 30 octobre 2010
30 oct. 2010 à 13:11
Bon je vais me faire taper sur les doigts mais je suis un peu perdu :)

//Recuperation resultats
$index=0;
while($row = mysql_fetch_row($result)){

$userid = $row[0];
$username = $row[1];
$time = $row[2];
$sdata = $row[3];
$arr_data = explode('"', $sdata);
$ligne= array($userid, $username, $time, $arr_data[1], $arr_data[3], $arr_data[5], $arr_data[7], $arr_data[9], $arr_data[11]);
$arr_result = array_fill($index,1,$ligne);
$index++;
echo ''.$arr_result[0][0].''; // résultat ok
}
echo ''.$arr_result[0][0].''; // vide ??

- Je ne comprends pas pourquoi lorsque je fais un
echo ''.$arr_result[0][0].''; dans la boucle while cela me donne bien ce que je veux mais en dehors du while arr_result est vide...

- Malgré votre aide et la doc je ne vois pas trop quel tri effectuer pour classer ce tableau selon la valeur de $arr_result[0][5] par exemple (d'autant plus qu'en dehors du while il ne vaut rien).
0
yexbe Messages postés 8 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 31 octobre 2010
30 oct. 2010 à 21:26
bonjour,

as-tu la main sur l'ordre mysql ?
car on pourrait demander à mysql de faire le tri avant d'avoir les resultats non...
je teste un bout de code et te le transmets

Elodie SAVARY

Touko Technologies : création de sites internets et de logiciels sur mesure
0
yexbe Messages postés 8 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 31 octobre 2010
30 oct. 2010 à 22:00
voici le tri sql que je te propose

SELECT * from matable order by STR_TO_DATE(SUBSTRING(SUBSTRING_INDEX(monchamp, '"', -2),1,LENGTH(SUBSTRING_INDEX(monchamp, '"', -2))-2),'%e %M %Y');


je detaille
ton exemple : a:5:{i:55;s:5:"Paris";i:62;s:7:"Toronto";i:57;s:15:"6 February 2011"}

SUBSTRING_INDEX(`monchamp`, '"', -2) donne la fin de la chaine en partant de l'avant derniere occurence de " dans ce champ
on obtient : 6 February 2011"}

LENGTH(SUBSTRING_INDEX(`monchamp`, '"', -2)) donne la longueur de cette chaine
on obtient 17

SUBSTRING(SUBSTRING_INDEX(`monchamp`, '"', -2),1,LENGTH(SUBSTRING_INDEX(`monchamp`, '"', -2))-2) permet donc d'enlever les deux derniers caractères de la sous chaine
on obtient 6 February 2011

STR_TO_DATE(SUBSTRING(SUBSTRING_INDEX(`monchamp`, '"', -2),1,LENGTH(SUBSTRING_INDEX(`monchamp`, '"', -2))-2),'%e %M %Y') transforme cette chaine en date mysql
on obtient 2011-02-06

et on trie directement dans l'ordre sql sur cette valeur...

après il faut voir au niveau des temps de réponses si c'est jouable et cela dépend de ta base.

Elodie SAVARY

Touko Technologies : création de sites internet et de logiciels sur mesure
0
Rejoignez-nous