SQL Utiliser résultat requete dans une autre
jaacki
Messages postés
31
Statut
Membre
-
Christounet Messages postés 1266 Statut Membre -
Christounet Messages postés 1266 Statut Membre -
Bonjour,
Comme mon dernier problème avait été résolu en très peu de temps, je ne prive pas de vous en soumettre un nouveau qui me ***** les ***** (pour rester poli bien sur...) depuis quelques temps:
Je travaille en php et mysql. J'exécute une requête sur ma bdd avec la fonction mysql_query que je stocke dans une variable, disons $rep. J'ai besoin d'effectuer deux autres requêtes à partir de celle ci ! Et c'est la mon problème, je ne sait pas comment réutiliser le résultat de cette requête dans une autre. Pour être plus clair, un exemple :
Voyez-vous mon petit problème ???
Merci d'avance pour vos idées !
A++
Ps: je précise que je sais que cela peut se faire facilement en ré exécutant la requete1 pour chacune des deux autres mais cette requête étant particulièrement longue à s'exécuter, je souhaite optimiser la chose !
Comme mon dernier problème avait été résolu en très peu de temps, je ne prive pas de vous en soumettre un nouveau qui me ***** les ***** (pour rester poli bien sur...) depuis quelques temps:
Je travaille en php et mysql. J'exécute une requête sur ma bdd avec la fonction mysql_query que je stocke dans une variable, disons $rep. J'ai besoin d'effectuer deux autres requêtes à partir de celle ci ! Et c'est la mon problème, je ne sait pas comment réutiliser le résultat de cette requête dans une autre. Pour être plus clair, un exemple :
$requete1 = "select blablabla from blablabla"; $rep = mysql_query($requete1); $requete2 = "select id, count(*) from ($rep) group by id"; $requete2 = "select id2, count(*) from ($rep) group by id2";
Voyez-vous mon petit problème ???
Merci d'avance pour vos idées !
A++
Ps: je précise que je sais que cela peut se faire facilement en ré exécutant la requete1 pour chacune des deux autres mais cette requête étant particulièrement longue à s'exécuter, je souhaite optimiser la chose !
A voir également:
- Utiliser le resultat d'une requete dans une autre requete sql
- Comment utiliser chromecast sur tv - Guide
- Resultat foot - Télécharger - Vie quotidienne
- Utiliser une tablette comme ecran pc - Guide
- Utiliser iphone comme webcam - Guide
- Votre pc ne peut pas utiliser un autre écran - Forum PC portable
16 réponses
Salut,
Déjà moi je ne mettrais pas de parenthèses dans la requête entre $rep :
$requete2 = "select id, count(*) from $rep group by id";
A la limite tu peux essayer ceci :
$requete2 = "select id, count(*) from ".$rep." group by id";
Déjà moi je ne mettrais pas de parenthèses dans la requête entre $rep :
$requete2 = "select id, count(*) from $rep group by id";
A la limite tu peux essayer ceci :
$requete2 = "select id, count(*) from ".$rep." group by id";
Bonjour,
Normalement tu peux insérer ta variable précédente dans une chaîne de caractères avec la concaténation :
$requete2 = "select id, count(*) from " . $rep . " group by id";
Il faut que ta variable ne contienne qu'une seule valeur par contre... si le résultat de ta requête contient plusieurs valeurs il doit falloir les stocker dans un tableau et faire une boucle...
Normalement tu peux insérer ta variable précédente dans une chaîne de caractères avec la concaténation :
$requete2 = "select id, count(*) from " . $rep . " group by id";
Il faut que ta variable ne contienne qu'une seule valeur par contre... si le résultat de ta requête contient plusieurs valeurs il doit falloir les stocker dans un tableau et faire une boucle...
Salut cameleon33,
merci de me repondre,
Pour la concaténation, je connaissais, il est même possible de faire directement
que je trouve plus lisible, qu'en penses-tu ?
Mais effectivement ma réponse contient bien plus d'une ligne. Ce que je vourdrais c'est mysql considère ce résultat comme si c'était une table en elle même, comme si on avait fait
Je ne sais pas si la solution des tableaux est la plus optimisée car le retour contient non seulement plusieurs lignes mais aussi quatre ou cinq colonnes.
merci de me repondre,
Pour la concaténation, je connaissais, il est même possible de faire directement
$requete2 = "select id, count(*) from $rep group by id";
que je trouve plus lisible, qu'en penses-tu ?
Mais effectivement ma réponse contient bien plus d'une ligne. Ce que je vourdrais c'est mysql considère ce résultat comme si c'était une table en elle même, comme si on avait fait
$requete2 = "select id, count(*) from (table1) group by id";
Je ne sais pas si la solution des tableaux est la plus optimisée car le retour contient non seulement plusieurs lignes mais aussi quatre ou cinq colonnes.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Quel est le type du résultat de ta requête?
Parceque en Access, je sais que c'est un tableau particulier et que tu peux te déplacer dedans... (c'est un recordset qu'on utilise)
En php, il me semble qu'on peut aussi naviguer dans les résultats... non?
Je vais aller chercher un peu
EDIT : Sur le site du zéro : https://openclassrooms.com/fr/courses#ss_part_2
Il parle du fait que le résultat de la requête est un tableau, il explique comment naviguer dedans.. Ce n'est pas exploitable pour ce que tu veux faire?
Parceque en Access, je sais que c'est un tableau particulier et que tu peux te déplacer dedans... (c'est un recordset qu'on utilise)
En php, il me semble qu'on peut aussi naviguer dans les résultats... non?
Je vais aller chercher un peu
EDIT : Sur le site du zéro : https://openclassrooms.com/fr/courses#ss_part_2
Il parle du fait que le résultat de la requête est un tableau, il explique comment naviguer dedans.. Ce n'est pas exploitable pour ce que tu veux faire?
et pourquoi ne pas écrire directement:
$requete2 = "select id, count(*) from select blablabla from blablabla group by id";
$requete2 = "select id2, count(*) from select blablabla from blablabla group by id2";
aux parenthèses près
$requete2 = "select id, count(*) from select blablabla from blablabla group by id";
$requete2 = "select id2, count(*) from select blablabla from blablabla group by id2";
aux parenthèses près
Merci beaucoup pour votre aide les gars mais vous n'avez pas bien compris ce que je souhaite faire visiblement.
algoplus, ta solution marcherait parfaitement à l'exception près que dans ton exemple :
la requête "select blablabla from blabla" sera exécutée DEUX fois !! Et c'est justement ce que je ne veux pas ! Cette requête met un certain temps à s'exécuter et mon but n'est donc pas de l'exécuter deux fois alors que je pense qu'il y une solution pour utiliser le résultat qu'elle retourne.
cameleon33, merci pour le lien sur le sdz mais ce tuto n'explique pas ce genre de cas. Il explique simplement comment exploiter le résultat d'une requête en php mais pas comment le réutiliser dans une seconde requête !
J'espère m'être mieux expliqué sur mon problème.
A+
algoplus, ta solution marcherait parfaitement à l'exception près que dans ton exemple :
$requete2 = "select id, count(*) from select blablabla from blablabla group by id"; $requete2 = "select id2, count(*) from select blablabla from blablabla group by id2";
la requête "select blablabla from blabla" sera exécutée DEUX fois !! Et c'est justement ce que je ne veux pas ! Cette requête met un certain temps à s'exécuter et mon but n'est donc pas de l'exécuter deux fois alors que je pense qu'il y une solution pour utiliser le résultat qu'elle retourne.
cameleon33, merci pour le lien sur le sdz mais ce tuto n'explique pas ce genre de cas. Il explique simplement comment exploiter le résultat d'une requête en php mais pas comment le réutiliser dans une seconde requête !
J'espère m'être mieux expliqué sur mon problème.
A+
Bonjour jaacki,
Le code suivant pourra peut-être t'aider
Explication du code
Le premier while va retourner toutes les lignes du select, pour chaque ligne retournée on construit la 2éme requête avec la valeur de la colonne qui t'intéresse, ensuite on retourne toutes les valeurs avec le second while, et de même avec le troisième while.
A plus
Le code suivant pourra peut-être t'aider
$requete1 = "select blablabla from blablabla";
$rep = mysql_query($requete1);
while ($row = mysql_fetch_array($rep))
{
$requete2 = "select id, count(*) from" .$row['blablabla']. "group by id";
$rep2 = mysql_query($requete2);
while ($row2 = mysql_fetch_array($rep2))
{
echo $row2['id'];
echo $row2[1];
}
$requete3 = "select id2, count(*) from" .$row['blablabla']. "group by id2";
$rep3 = mysql_query($requete3);
while ($row3 = mysql_fetch_array($rep3))
{
echo $row3['id2'];
echo $row3[1];
}
}
Explication du code
Le premier while va retourner toutes les lignes du select, pour chaque ligne retournée on construit la 2éme requête avec la valeur de la colonne qui t'intéresse, ensuite on retourne toutes les valeurs avec le second while, et de même avec le troisième while.
A plus
Bonjour jaacki,
Le code suivant pourra peut-être t'aider
Explication du code
Le premier while va retourner toutes les lignes du select, pour chaque ligne retournée on construit la 2éme requête avec la valeur de la colonne qui t'intéresse, ensuite on retourne toutes les valeurs avec le second while, et de même avec le troisième while.
A plus
Le code suivant pourra peut-être t'aider
$requete1 = "select blablabla from blablabla";
$rep = mysql_query($requete1);
while ($row = mysql_fetch_array($rep))
{
$requete2 = "select id, count(*) from" .$row['blablabla']. "group by id";
$rep2 = mysql_query($requete2);
while ($row2 = mysql_fetch_array($rep2))
{
echo $row2['id'];
echo $row2[1];
}
$requete3 = "select id2, count(*) from" .$row['blablabla']. "group by id2";
$rep3 = mysql_query($requete3);
while ($row3 = mysql_fetch_array($rep3))
{
echo $row3['id2'];
echo $row3[1];
}
}
Explication du code
Le premier while va retourner toutes les lignes du select, pour chaque ligne retournée on construit la 2éme requête avec la valeur de la colonne qui t'intéresse, ensuite on retourne toutes les valeurs avec le second while, et de même avec le troisième while.
A plus
Salut !
Merci pour ton temps. Par contre ce code que tu me donnes ne me convient pas tout simplement car les sous-requêtes sont construites à partir de chaque lignes du résultat de la première requête or ce n'est pas ce que je veux ! Je veux que les sous-requêtes utilise le résultat donné par la requête 1, pas ligne par ligne.
En fait, cet exemple pourrait peut être rendre la chose plus claire : je voudrais que le résultat de la première requête soit considéré comme une vue qui serait ensuite interrogée par les deux autres requêtes 2 et 3. Peut être cette comparaison permet de mieux expliquer mon problème ??
Merci pour ton temps. Par contre ce code que tu me donnes ne me convient pas tout simplement car les sous-requêtes sont construites à partir de chaque lignes du résultat de la première requête or ce n'est pas ce que je veux ! Je veux que les sous-requêtes utilise le résultat donné par la requête 1, pas ligne par ligne.
En fait, cet exemple pourrait peut être rendre la chose plus claire : je voudrais que le résultat de la première requête soit considéré comme une vue qui serait ensuite interrogée par les deux autres requêtes 2 et 3. Peut être cette comparaison permet de mieux expliquer mon problème ??
Bonjour jaacki,
La solution serait de passer par une table temporaire et d'effectuer tes requêtes sur cette table temporaire
Tu dois juste avoir les privilèges nécessaires pour la création des tables. La table temporaire sera automatiquement détruite à la fin de la connection.
A plus
La solution serait de passer par une table temporaire et d'effectuer tes requêtes sur cette table temporaire
$create_table = "CREATE TEMPORARY TABLE matable AS SELECT blablabla FROM blablablabla";
$lacreation = mysql_query($create_table) or die ('Erreur création table temporaire');
$requete2 = "select id, count(*) from matable group by id";
$requete3 = "select id2, count(*) from matable group by id2";
Tu dois juste avoir les privilèges nécessaires pour la création des tables. La table temporaire sera automatiquement détruite à la fin de la connection.
A plus
Voila c'est une solution de ce style la que je voulais ! Seulement je me demande, en termes de performances, la création de tables temporaires est plutôt rapide ou plus longue ??
Le but est bien évidement de gagner du temps donc ce critère prime !
Le but est bien évidement de gagner du temps donc ce critère prime !
Bonjour,
Tout dépendra du nombre de lignes retourné par ton select.
Tu peux aussi créer ta table temporaire en mémoire, le code étant alors
Lorsque tes autres requêtes n'ont plus besoin de ta table temporaire et tu veux libérer de l'espace mémoire, tu rajoutes le code suivant
A plus
Tout dépendra du nombre de lignes retourné par ton select.
Tu peux aussi créer ta table temporaire en mémoire, le code étant alors
$creation = "create temporary table matable engine=memory as select blablabla from blablablabla"
Lorsque tes autres requêtes n'ont plus besoin de ta table temporaire et tu veux libérer de l'espace mémoire, tu rajoutes le code suivant
$drop = "drop temporary table matable"
A plus
la variable $rep ne contient pas une valeur ici (cf mon exemple) mais elle contient le retour de la fonction mysql_query !
En fait en executant ce code , php remplace $rep par "Resource id #8", donc évidement la requete ne fonctionne pas !