Page 1 sur 1

Imbrication de 2 requêtes complexes.

Posté : 31 juil. 2005, 00:20
par urika
J'ai un petit souci. Peut-être que quelqu'un pourra m'aider.

J'utilise une première requête (requête1) qui me paraît déjà pas simple pour extraire des données d'une base MySQL. Celle-là, pas de pb, elle fonctionne. :lol:

Ensuite, je voudrais faire une 2è requête sur le contenu de la première mais là, je sais pas si c'est faisable et quelle synthaxe utiliser. J'ai essayé un peu de tout mais sans résultat.. :cry:

$requete1 = mysql_query("SELECT liste_decades.decade, prelevements.no_carte FROM liste_decades LEFT JOIN prelevements ON liste_decades.no_decade = prelevements.no_decade WHERE prelevements.no_carte='$no_carte' ");

$requete2 = mysql_query("SELECT liste_decades.decade FROM ['$requete1'] RIGHT JOIN liste_decades ON ['$requete1'].no_decade = liste_decades.no_decade WHERE ['$requete1'].no_carte Is Null ");


Et si je recopie à chaque fois la 1ère à la place de "requête 1", ça marche pas non plus mais c'est peut-être aussi un pb de synthaxe...

Merci d'avance à celui qui pourra m'aider ...

Posté : 31 juil. 2005, 00:51
par ouckileou
ça ne marche pas comme ça, tu ne peux pas utiliser le résultat brut d'une requête (resource) dans une autre.

Soit tu récupères les valeurs de la première et tu les insères dans l'autre, soit tu te débrouilles pour tout faire d'un coup.

Si tu as un version de MySQL suffisante, tu auras accès aux sous-requêtes.

Tu peux donc choisir une solution et tenter des essais, et revenir ici pour que l'on t'aide.

Bonne chance ;)

Posté : 31 juil. 2005, 08:24
par Ripat
En première lecture ta deuxième requête retournera toujours un recordset vide.

Pourrais-tu nous mettre un petit échantillon représentatif des deux tables (avec mysqldump pour faciliter la création de tes tables - ou, au pire, fais un SHOW CREATE TABLE taTable). Et nous reformuler ce que tu souhaites extraire.

Posté : 31 juil. 2005, 11:00
par pjl
et si tu commencais par tester tes requêtes dans un client MySQL comme PHPMyAdmin, ce ne serait pas plus simple ?

Posté : 31 juil. 2005, 14:29
par Invité
Merci d'avoir répondu si vite...

Alors je vais essayer d'éclaircir les choses.
En clair je voudrais trouver les no_decade pour lesquels je ne trouve pas un n° de carte donné dans la table prelevement. :x :x

Un extrait des tables :
la table "liste_decades" commence comme ça et va jusque juillet..
no_decade decade
1 21 au 31 août
2 1er au 10 septembre
3 11 au 20 septembre


Ensuite la table "prelevements"
no no_carte no_decade participation
22 210 1 9
23 211 1 4
63 212 1 6
64 210 2 0
65 213 1 4
66 212 2 5


Effectivement si je visualise les résultats corrects de la première, la deuxième doit être vide et l'affichage dans un boucle while avec mysql_fetch_array plante.

Ma version de mySQL est 4.1.9 donc normalement les sous-requêtes fonctionnent.

J'ai essayé d'inclure toute la première entre parenthèses là ou j'ai écrit ['$requete1'] dans la seconde et là aussi ça plante. Mais peut-on écrire (SELECT...).no_carte=... ?

Ouckileou, comment tu fais pour insérer les résultats de l'une dans l'autre parce qu'en fait c'est ce que j'essaiyais de faire ! :?

Si tout ceci vous donne des idées, je suis preneur !!
Merci encore

Posté : 31 juil. 2005, 14:55
par pjl
pas besoin de sous requetes pour celà.
Une simple requête externe suffit.

Posté : 31 juil. 2005, 15:27
par urika
:shock: :shock: Là je décroche... T'aurais pas un exemple qui cause :?: :?:

Posté : 31 juil. 2005, 19:21
par pjl
désolé, ce n'est pas requête externe mais jointure externe.

Posté : 31 juil. 2005, 19:23
par Cyrano
Petite question urika: quelle version de MySQL : parce que le NOT IN ne fonctionne pas avant la version 4.1 de MySQL, le type de requête ne sera pas le même... :?:

Posté : 31 juil. 2005, 19:27
par urika
SQL : 4.1.9 et PHPmy Admin 2.6.1

Posté : 31 juil. 2005, 20:06
par Cyrano
Bon, j'ai un peu de mal à comprendre ce que tu cherches à obtenir, mais si je me suis pas trompé, par rapport au bout de tables que tu as montré, ce que tu voudrais voir apparaître en fin de compte, c'est la decade "du 11 au 20 septembre" mais pas les autres. Si c'Est bien ça, une seule requête :

Code : Tout sélectionner

SELECT DISTINCT(l.decade) FROM liste_decades as l, prelevements as p WHERE l.no_decade NOT IN (SELECT DISTINCT(p.no_decade) FROM prelevements as p)
Chez moi ça fonctionne, mais je ne suis pas certain de mon coup à 100%, donc je garde une réserve.

Posté : 31 juil. 2005, 23:11
par urika
Merci pour tes efforts mais c'est pas tout à fait çà :? :? . Je te donne un exemple :

En fait, je voudrais que pour un no_carte=210 ou 212, ce soit la décade 3 qui sorte (il a déjà été prélevé de la 1 et la 2), que pour le 211 et 213 ce soient les décades 2 et 3.
Le no_carte est une obtenue auparavant. De ce paramètre, va donc dépendre le résultat de la requête.

Bonne nuit...

Posté : 31 juil. 2005, 23:46
par urika
J'ai encore essayé celle-là :

$requete1 = mysql_query("SELECT l.no_decade, l.decade
FROM liste_decades AS l
WHERE l.no_decade NOT IN (SELECT l.no_decade FROM l LEFT JOIN prelevements ON l.no_decade = prelevements.no_decade WHERE prelevements.no_carte='$no_carte') ");


mais toujours sans succès.
Demain sera un autre jour !

Posté : 01 août 2005, 00:33
par pjl
Ca ne marche pas, ca ?

Code : Tout sélectionner

SELECT liste_decades.decade FROM prelevements LEFT JOIN liste_decades ON prelevements .no_decade = liste_decades.no_decade WHERE prelevements .no_carte Is Null

Posté : 01 août 2005, 09:43
par urika
Je peux pas essayer, je suis pas devant le bon poste mais ça doit pas coller : la decade qui sort du select ne peut venir de prelevement puisqu'elle n'existe précisément pas dans cette table et la condition sur no_carte=null ne colle pas non plus puisque c'est justement pour un n° donné qu'on doit récupérer les infos.
Merci quand même...