Imbrication de 2 requêtes complexes.

Petit nouveau ! | 8 Messages

31 juil. 2005, 00:20

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 ...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

31 juil. 2005, 00:51

ç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 ;)

ViPHP
ViPHP | 1380 Messages

31 juil. 2005, 08:24

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.
ripat

ViPHP
pjl
ViPHP | 2119 Messages

31 juil. 2005, 11:00

et si tu commencais par tester tes requêtes dans un client MySQL comme PHPMyAdmin, ce ne serait pas plus simple ?

Invité
Invité n'ayant pas de compte PHPfrance

31 juil. 2005, 14:29

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

ViPHP
pjl
ViPHP | 2119 Messages

31 juil. 2005, 14:55

pas besoin de sous requetes pour celà.
Une simple requête externe suffit.

Petit nouveau ! | 8 Messages

31 juil. 2005, 15:27

:shock: :shock: Là je décroche... T'aurais pas un exemple qui cause :?: :?:

ViPHP
pjl
ViPHP | 2119 Messages

31 juil. 2005, 19:21

désolé, ce n'est pas requête externe mais jointure externe.

Mammouth du PHP | 19672 Messages

31 juil. 2005, 19:23

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... :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

31 juil. 2005, 19:27

SQL : 4.1.9 et PHPmy Admin 2.6.1

Mammouth du PHP | 19672 Messages

31 juil. 2005, 20:06

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

31 juil. 2005, 23:11

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...

Petit nouveau ! | 8 Messages

31 juil. 2005, 23:46

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 !

ViPHP
pjl
ViPHP | 2119 Messages

01 août 2005, 00:33

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

Petit nouveau ! | 8 Messages

01 août 2005, 09:43

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...