Alainp Posté 27 Octobre 2011 Posté 27 Octobre 2011 (modifié) Bonjour, Est-il possible de faire plusieurs requêtes imbriquées sur une seule table. Cela fait plusieurs jours que je suis coincé. Voici un extrait de ma table, ces données se répétant pour X villes. Avec la requête qui suit, je récupère la ville concernée par le mois (variable provenant de mon code php, dans le cas présent 'jui') et le code demandés. $q = mysql_query("SELECT * FROM table WHERE round($mois, 0) = 16 and code=203");while ($r1 = mysql_fetch_array($q)) {$villetrouvee = $r1["ville"];} Souhaitant récupérer les autres données de cette même ville, je veux insérer (avant la fin du premier while) une seconde requête sous la forme $q2 = mysql_query("SELECT * FROM table WHERE ville = '$villetrouvee' and code=202");while ($r2 = mysql_fetch_array($q2)) {$autredonnée1 = $r2['$mois']; // devrait me récupérer 11,8} et ainsi de suite pour récupérer les données des autres codes avant que la première requête ne trouve d'autres villes. J'ai essayé mais la réponse n'arrive pas et je ne veux pas bloquer les serveurs (je suis en mutualisé) J'espère avoir été clair. Merci Modifié 27 Octobre 2011 par Alainp
Ernestine Posté 27 Octobre 2011 Posté 27 Octobre 2011 Bonjour, Soit je n'ai rien compris à ce que tu veux faire, soit tu t'y prends très mal. Parce que là, j'ai l'impression que toutes tes requêtes pourraient être réalisées en une seule. Pourrais-tu expliquer clairement (pas la peine de copier du code) ce que tu veux faire sur cette table ?
SStephane Posté 27 Octobre 2011 Posté 27 Octobre 2011 $sql = sprintf("SELECT * FROM table WHERE ville IN (SELECT ville FROM table WHERE round(%s, 0) = 16 AND code=203)", mysql_real_escape_string($mois));$resource = mysql_query($sql); et tu as toutes les données.
Alainp Posté 1 Novembre 2011 Auteur Posté 1 Novembre 2011 Bonjour à tous et désolé, je n'ai pas pu revenir plus tôt sur le forum ..... soit tu t'y prends très mal. C'est exactement çà, je ne suis pas super doué dans les requêtes sql $sql = sprintf("SELECT * FROM table WHERE ville IN (SELECT ville FROM table WHERE round(%s, 0) = 16 AND code=203)", mysql_real_escape_string($mois));$resource = mysql_query($sql); et tu as toutes les données. C'est ce que je voudrai mais, compte tenu de mon faible niveau en SQL, comment j'exploite le résultat contenu dans $resource pour récupérer la donnée d'une ligne, celle d'une autre, etc... ? Dans une requête simple, je fais echo $resource["code"]; mais là ? Merci
Alainp Posté 1 Novembre 2011 Auteur Posté 1 Novembre 2011 (modifié) Pourrais-tu expliquer clairement (pas la peine de copier du code) ce que tu veux faire sur cette table ? Je vais essayer, J'ai une table qui comprend environ 12.000 villes avec, pour chacune d'elles et mois par mois la température moyenne, le minimum, le maximum, la pluie, le vent, etc.. (Voir l'extrait dans mon premier message) Ces données mensuelles ont un code, 203 pour la température, etc... Mon objectif: Afficher toutes les villes qui ont, par exemple 16 degrés de température moyenne (code 203) en juin (colonne "jui"), çà c'est facile je sais faire Mais je voudrai aussi afficher en ligne, le minimum, le maximum, la pluie, le vent pour chaque ville affichée et pour le même mois. Dans l'extrait précité, çà m'afficherait la série 16,9 22,1 11,8 55 73 3,4 pour juin et pour cette ville. Vu la quantité de données il faut que cela soit le plus rapide possible Voila, j'espère avoir décrit clairement ce que je cherche à faire. Modifié 1 Novembre 2011 par Alainp
SStephane Posté 2 Novembre 2011 Posté 2 Novembre 2011 $sql = sprintf("SELECT * FROM table WHERE ville IN (SELECT ville FROM table WHERE round(%s, 0) = 16 AND code=203)", mysql_real_escape_string($mois));$resource = mysql_query($sql); Ce n'est pas du sql apres, c'est du php, ceci t'affichera le résultat de ta requête, tu en fais ce que tu en veux while($r = mysql_fetch_array($resource)){print_r($r);}
Alainp Posté 2 Novembre 2011 Auteur Posté 2 Novembre 2011 (modifié) Bonjour, Ce n'est pas du sql apres, c'est du php, ceci t'affichera le résultat de ta requête, tu en fais ce que tu en veux Bien sur mais je ne savais pas comment récupérer les données contenues dans $resource Je viens de tester ce code $sql = sprintf("SELECT * FROM table WHERE ville IN (SELECT ville FROM table WHERE round(%s, 0) = 16 AND code=203)", mysql_real_escape_string($mois)); $resource = mysql_query($sql);while($r = mysql_fetch_array($resource)){ print_r($r); } Cà me donne l'anomalie Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /...../...../www/nom_page.php on line 107 la ligne 107 est celle où il y a while($r = mysql_fetch_array($resource)){ J'ai l'impression qu'il y a un problème avec la requête imbriquée car si je mets $sql = sprintf("SELECT ville FROM table WHERE round(%s, 0) = 30 AND code=203", mysql_real_escape_string($mois)); çà fonctionne, les villes s'affichent, mais dès que je remets les 2 requêtes imbriquées, j'ai la même anomalie précitée. Modifié 2 Novembre 2011 par Alainp
Ernestine Posté 2 Novembre 2011 Posté 2 Novembre 2011 Peut-être que la requête ne s'effectue pas correctement. Tu peux remplacer $resource = mysql_query($sql); par $resource = mysql_query($sql) or die(mysql_error()); Comme ça, si une erreur s'affiche, c'est que quelque chose ne va pas (et tu sauras précisément d'où vient l'erreur). Par ailleurs, avant de faire ta requête en php, il serait préférable que tu l'écrives directement en SQL pour la tester : c'est plus facile, et au moins, une fois que c'est fait, c'est une grosse partie du problème de résolu. Pour cela, dans phpmyadmin, tu cliques sur l'onglet SQL et tu tapes ta reqête, ce qui devrait donner : SELECT * FROM table WHERE ville IN (SELECT ville FROM table WHERE round(juin, 0)=30 AND code=203) Comme ça, tu verras tout de suite si ça fonctionne ou pas. Si ça fonctionne, tu verras clairement à quoi ressemble le tableau de réponse, et si ça ne fonctionne pas, le message d'erreur est en général très explicite.
Alainp Posté 3 Novembre 2011 Auteur Posté 3 Novembre 2011 Comme ça, tu verras tout de suite si ça fonctionne ou pas. Si ça fonctionne, tu verras clairement à quoi ressemble le tableau de réponse, et si ça ne fonctionne pas, le message d'erreur est en général très explicite. Bonjour et merci Ernestine, c'est une excellente idée Malheureusement, impossible de trouver l'origine du non fonctionnement J'ai limité au maximum la requête pour tenter d'avoir un résultat mais négatif. Voici la requête et son résultat SELECT * FROM table WHERE ville IN(SELECT ville FROM table WHERE code = 203) Erreurrequête SQL: SELECT * FROM tableWHERE villeIN (SELECT villeFROM tableWHERE code =203)LIMIT 0 , 30 MySQL a répondu: #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT ville FROM temp WHERE code = 203)LIMIT 0, 30' at line La seule qui fonctionne c'est : SELECT ville FROM table WHERE code = 203
captain_torche Posté 3 Novembre 2011 Posté 3 Novembre 2011 Quelle version de MySQL utilises-tu ? (Tu devrais voir l'info sur la page d'accueil de PHPMyAdmin).
Alainp Posté 3 Novembre 2011 Auteur Posté 3 Novembre 2011 (modifié) Quelle version de MySQL utilises-tu ? (Tu devrais voir l'info sur la page d'accueil de PHPMyAdmin). Voila ce que j'ai sur la page d'accueil Version du client MySQL: 5.0.51a EDIT Je crois que j'ai trouvé Il est bien indiqué Version du client MySQL: 5.0.51a Mais sur une autre ligne, il est également indiqué Version du serveur: 4.0.25-standard-log J'ai regardé sur une autre base et la, c'était marqué Version du serveur: 5.0.90-log J'ai essayé les requêtes imbriquées sur cette base et elles fonctionnent Désolé de vous avoir fait perdre du temps. Modifié 3 Novembre 2011 par Alainp
SStephane Posté 3 Novembre 2011 Posté 3 Novembre 2011 En effet, pas de requêtes imbriquées avec ta version du serveur : tu devrais upgrader, cette version n'offre vraiment que peu de fonctionnalités de sgbd moderne.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant