Optimiser while php

WRInaute impliqué
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:
$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'];

        }
 
WRInaute impliqué
suite

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?
 
WRInaute impliqué
suite

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);
 
WRInaute passionné
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.
 
WRInaute accro
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).
 
WRInaute passionné
UsagiYojimbo a dit:
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.
 
WRInaute occasionnel
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.
 
WRInaute impliqué
suite

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.
 
WRInaute passionné
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 ;)
 
Discussions similaires
Haut