Requête(s) inutile(s)?

Petit nouveau ! | 6 Messages

13 avr. 2006, 17:41

bonjour à tous, je suis nouveau ici,...

J'aimerais pouvoir afficher les résultats d'une requête en deux colonnes.
La première colonne affiche la première moitié des résultats et la suivante, la seconde motié.
J'y arrive mais en deux requêtes alors qu'une seule devrait suffire je pense mais je ne vois pas comment y arriver (je débute, c'est mon premier script)...

Voilà ma méthode actuelle:
1) je fait ma requete_1 dans laquelle je demande de sélectionner le nom et l'id des éléments qui se trouvent dans ma table
2) je fait un num_row sur cette requête_1 pour savoir le nombre d'éléments existants.
3) Je vérifie si ce nombre est pair sinon, je l'incrémente de 1
4) Je divise le nombre obtenu par deux, dès lors je connais le nombre maximum d'éléments par colonnes (appelons ce nombre maximum "$nbr_lignes").
5) Je REfait une requête_2 pour obtenir l'id et le nom des éléments de ma table avec une LIMIT inférieure qui vaut $nbr_lignes, de la sorte, je ne liste que les éléments de la seconde colonne.
6) J'affiche le tout ligne par ligne, tant que l'id des éléments ne dépasse pas $nbr_lignes: le resultat de la requête 1 dans la première colonne et le résultat de la requête2 dans la seconde colonne.

Ca fonctionne, j'obtiens bien pour 7 éléments:
1 xunxxxxx | 5 xcinqxxx
2 xdeuxxxx | 6 xsixxxxx
3 xtroisxxx | 7 xseptxxx
4 xquatrex |

Mais je trouve que l'étape N°5 est de trop puisque les éléments qui s'y trouvent existent déjà dans la première requête.
J'ai bien pensé à faire de la sorte avec une seule requête:
1 | (1+$Nbr_lignes)
2 | (2+$Nbr_lignes)
3 | (3+$Nbr_lignes)
4 | (4+$Nbr_lignes)

Mais si cela marche avec les id's (puisqu'il est simple de traiter en php une somme de deux chiffres), il faut que j'affiche le nom des éléments aussi et là cela implique pour la seconde colonne que la somme faite=l'id correspondant à chaque nom à afficher.

Et je ne vois pas comment faire cette correspondance sans refaire une requête SQL.

Avez-vous une méthode à une seule requête à me conseiller pour obtenir ce dernier cas de figure?

En fait, disons que je ne vois pas, en règle générale, comment pouvoir a posteriori manipuler des resultats dont je dispose.

J'ai des pommes vertes et rouges dans mon panier et quand je ne veux que des vertes, je jette toutes celles que j'ai déjà, sans distinction, pour remplir à nouveau mon panier d'autres exclusivement de cette couleur.
C'est l'inverse de ce que j'appellerais "optimiser".

J'espère que vos réponses eventuelles vont m'aiguiller

merci pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 avr. 2006, 18:00

Il doit y avoir pas mal de solutions... Personnellement si tu n'as pas de contraintes sur l'ordre, je mettrais les enregistrements par lignes et non pas par colonnes (ce qui se fait beaucoup plus simplement en html et ne nécessite pas de savoir combien il y a d'enregistrements, il suffit juste de completer avec une cellule vide si on fini sur une ligne impaire) :

enreg 1 | enreg 2
enreg 3 | enreg 4
enreg 5 ...


Sinon pour partir de ton principe, tu peux te contenter d'effectuer une seule fois la requête qui te ramene nom et id et utiliser la fonction
mysql_num_rows()
pour savoir combien elle comporte de résultats avant de les lire.
Il ne te reste plus alors qu'à faire ta division pour trouver le milieu, lister tes résultats jusqu'à celui-ci et recommencer dans ta 2ème colonne avec les enregistrement restant... :)

Petit nouveau ! | 6 Messages

13 avr. 2006, 18:23

Merci pour ta réponse.
Effectivement j'ai une contrainte d'ordre sinon je n'aurais aucun problème.

En ce qui concerne le fait d'affecter une colonne puis l'autre, je ne te suis pas, à moins de faire 2 tableaux à une colonne côtes à côtes ce qui serait dommage bien que faisable.
En effet, il me semble que dans un seul tableau, on ne peut insérer des éléments que ligne par ligne et non colonne par colonne, non?

Comme je le disais, mon script fonctionne à merveille tel qu'il est avec ses deux requêtes mais il m'avait semblé qu'une requête était de trop de et ce, de manière FLAGRANTE.
Si ce n'est pas une erreur flagrante de débutant, je laisse comme c'est puisque ça fonctionne...

Voilà ce qu'il donne pour l'instant:
http://www.lexgotham.com/categories.php

C'est un script de catégories à niveau indéfini.
Même si l'ordre ne semble pas être rigoureux à première vue, il l'est par l'ID et suit bien la logique énoncée plus haut.