SQL Utiliser résultat requete dans une autre

Fermé
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009 - 24 juil. 2008 à 15:52
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 - 29 juil. 2008 à 17:40
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 :

$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:

16 réponses

biguiz Messages postés 201 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 6 novembre 2009 35
24 juil. 2008 à 16:00
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";
1
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
24 juil. 2008 à 16:06
Salut,

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
$requete2 = "select id, count(*) from $rep group by id"; 
, php remplace $rep par "Resource id #8", donc évidement la requete ne fonctionne pas !
0
cameleon33 Messages postés 635 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 26 février 2010 50
24 juil. 2008 à 15:57
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...
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
24 juil. 2008 à 16:03
Salut cameleon33,

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.
0
cameleon33 Messages postés 635 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 26 février 2010 50
24 juil. 2008 à 16:05
Ah d'accord, je vois ce que tu veux faire..

Malheureusement, ça dépasse largement mon niveau en PHP/Mysql... enfin je pense.

Peut-être que quelqu'un d'autre pourra t'aider plus efficacement que moi :p

Bon courage!
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
24 juil. 2008 à 16:07
merci quand même !
A+
0

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

Posez votre question
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
25 juil. 2008 à 09:48
Personne n'a une idée ??
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
28 juil. 2008 à 09:17
uuuuuup !! Need help !!
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
28 juil. 2008 à 15:16
uuuuuuuppp

Sérieux personne n'aurait une idée pour m'aider à résoudre ce problème ??
0
cameleon33 Messages postés 635 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 26 février 2010 50
28 juil. 2008 à 15:25
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?
0
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
0
cameleon33 Messages postés 635 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 26 février 2010 50
29 juil. 2008 à 08:07
Ahhh c'est vrai qu'on peut faire des requêtes imbriquées en SQL... Ca doit marcher... Faut vérifier la synthaxe mais sinon ça doit marcher.
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
29 juil. 2008 à 10:12
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 :
$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+
0
cameleon33 Messages postés 635 Date d'inscription mardi 8 juillet 2008 Statut Membre Dernière intervention 26 février 2010 50
29 juil. 2008 à 10:14
Ce que j'ai compris de ton problème :

Tu fais une requête. Elle te donne des résultats et tu veux pouvoir réutiliser ses résultats à l'intérieur d'une autre requête.. C'est bien cela?
0
En fait les requêtes 2, ne servent qu'à compter.

Si dans $rep tu as le resultat de ta requete blablabla ..., pas besoin d'autres requêtes, avec un peu de code tu peux compter le nombre de fois ou apparaissent id et id2.

Non?
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009 > algoplus
29 juil. 2008 à 11:10
Oui mais je compte avec une clause GROUP BY qui n'est pas forcément évidente à reproduire en php alors qu'elle est très simple à utiliser en sql.
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
29 juil. 2008 à 11:04
Oui, c'est ça mais je ne veux surtout pas Ré exécuter cette requête.
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 391
29 juil. 2008 à 11:33
Bonjour jaacki,

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
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 391
29 juil. 2008 à 12:15
Bonjour jaacki,

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
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
29 juil. 2008 à 13:24
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 ??
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 391
29 juil. 2008 à 13:52
Bonjour jaacki,

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
0
jaacki Messages postés 31 Date d'inscription vendredi 2 novembre 2007 Statut Membre Dernière intervention 28 janvier 2009
29 juil. 2008 à 16:37
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 !
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 391
29 juil. 2008 à 17:40
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
$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
0