Optimiser while php


sff
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 336
Inscription: 2 Fév 2005

Optimiser while php

Message le Sam Nov 08, 2008 13:18

Bonjour,

J'aimerais savoir si c'est possible d'avoir la requête qui récupère le champ charname en fonction de l'id, en dehors du while.

Merci


Code: Tout sélectionner
$boxquery = doquery("SELECT id FROM {{table}} WHERE for1='$userrow[id]' ORDER BY date DESC LIMIT $limit_start, $pagination", "profile_box");

       
        while ($boxrow = mysql_fetch_assoc($boxquery)) {



                $fromquery = doquery("SELECT charname FROM {{table}} WHERE id='$boxrow[id]' LIMIT 1", "users");

                $fromrow = mysql_fetch_assoc($fromquery);



                echo $fromrow['charname'];

        }
Dernière édition par sff le Sam Nov 08, 2008 13:51, édité 1 fois.

Robinson
WRInaute passionné
WRInaute passionné
 
Messages: 2231
Inscription: 25 Oct 2005

Message le Sam Nov 08, 2008 13:22

En déclarant une variable avant le while et en lui attribuant la valeur...


sff
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 336
Inscription: 2 Fév 2005

suite

Message le Sam Nov 08, 2008 13:24

Tu peux me montrer un exemple, je comprends pas trop ce que tu veux dire

Je peux mettre une variable avant le while, mais de quelle valeur tu parle?

Robinson
WRInaute passionné
WRInaute passionné
 
Messages: 2231
Inscription: 25 Oct 2005

Message le Sam Nov 08, 2008 13:35

Code: Tout sélectionner
$tavariable = "";

while(...){
............
$tavariable = $fromrow['charname'];
}


sff
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 336
Inscription: 2 Fév 2005

suite

Message le Sam Nov 08, 2008 13:39

Je comprends pas trop ce que tu veux dire. Peut être tu as pas compris ce que je voulais faire.

En fait je voudrais exécuter cette requête en dehors du while :

$fromquery = doquery("SELECT charname FROM {{table}} WHERE id='$boxrow[from1]' LIMIT 1", "users");

$fromrow = mysql_fetch_assoc($fromquery);

tonguide
WRInaute passionné
WRInaute passionné
 
Messages: 1393
Inscription: 28 Nov 2003

Message le Sam Nov 08, 2008 13:50

Je ne comprends pas trop d'où vient "$boxrow[from1]"

Sinon, je dirai qu'une jointure serait la meilleur solution.

SELECT colonne
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE t1.id = X

Mais sans la structure etc ... difficile d'en dire plus.


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8300
Inscription: 23 Nov 2005

Message le Sam Nov 08, 2008 13:50

La question qui me turlupine est : est ce que dans les deux requêtes tu effectues tes requêtes sur la même table ?

Si c'est le cas la réponse de Robinson est la bonne.

Sinon tu peux effectuer ta jointure directement dans la première requête (via un LEFT JOIN ou un INNER JOIN suivant les cas).

Après il serait intéressant de savoir si pour un enregistrement dans la première table tu peux en avoir plusieurs dans la seconde (ou pas).

tonguide
WRInaute passionné
WRInaute passionné
 
Messages: 1393
Inscription: 28 Nov 2003

Message le Sam Nov 08, 2008 13:53

UsagiYojimbo a écrit:La question qui me turlupine est : est ce que dans les deux requêtes tu effectues tes requêtes sur la même table ?


$fromquery = doquery("SELECT charname FROM {{table}} WHERE id='$boxrow[id]' LIMIT 1", "users");

le "users" à la fin, je crois que c'est le nom de la table. Et donc les requetes ne sont pas sur la mm table.


sff
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 336
Inscription: 2 Fév 2005

suite

Message le Sam Nov 08, 2008 13:53

Tonguide, exact j'ai fais une erreur, c'est pas $boxrow[from1], mais $boxrow[id].


LiFi
WRInaute impliqué
WRInaute impliqué
 
Messages: 609
Inscription: 14 Juil 2008

Message le Sam Nov 08, 2008 13:54

Tu devrais plutot alors construire un chaine de caracteres dans ton while afin de mettre tous les $boxrow[from1] comme ca:

$machaine .= "$boxrow[from1],";

apres une fois sorti du while tu vires le dernier caractere de la chaine puisque ce sera une virgule en trop et tu fais une seule requete avec id IN (8,3,7,1,9,5...) au lieu de ton id= :

$fromquery = doquery("SELECT charname FROM {{table}} WHERE id IN ($machaine)", "users");

et apres tu te fais un autre while pour afficher tous les resultats.

tu vois?

while () {
creer une chaine d'ids
}
faire une seule requete avec tous les ids
while () {
ecrire les données a lecran
}

bon apres c'est sur ca doit etre possible d'ecrire tout ca en une seule requete, moi je te donne simplement la logique pour ne pas faire 36000 requetes dans un while.


sff
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 336
Inscription: 2 Fév 2005

suite

Message le Sam Nov 08, 2008 13:59

Non UsagiYojimbo, il s'agit de 2 table différentes.

En fait c'est une messagerie.

La table profile_box contient les messages (ID est celui qui à envoyé le message)

La table users contient le pseudo de tous les utilisateur du site.

Donc dans le while on affiche le pseudo de celui qui à envoyé le message.

tonguide
WRInaute passionné
WRInaute passionné
 
Messages: 1393
Inscription: 28 Nov 2003

Message le Sam Nov 08, 2008 13:59

SELECT p_b.id, u.charname
FROM profile_box p_b
LEFT JOIN users u ON u.id = p_b.id
WHERE p_b.for1='$userrow[id]'
GROUP BY u.id
ORDER BY p_b.date DESC LIMIT $limit_start, $pagination

tu fais ça comme requete (GROUP BY u.id < utile uniquement si il est possible qu'il y ai plusieurs résultats dans "users")

et donc tu auras $boxrow['charname'] directement.

Bon courage ;)


sff
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 336
Inscription: 2 Fév 2005

suite

Message le Sam Nov 08, 2008 14:03

Ok je test


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités