Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2006, 10h49   #1
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
Par défaut [SQL] Requête dans une requête...avec des INNER JOIN!

Bonjour, j'ai la requête suivante:

Code :
1
2
3
4
$req_sel_typepdt="SELECT Produit.Id_Produit,Produit.Id_Type_Produit,";
$req_sel_typepdt.="Type_Produit.Id_Type_Produit,Type_Produit.Nom_Type_Produit";
$req_sel_typepdt.="FROM Produit INNER JOIN Type_Produit ON ";
$req_sel_typepdt.="Produit.Id_Type_Produit=Type_Produit.Id_Type_Produit";
...qui me crée un table de produits et type de produits avec les lignes:

Code :
1
2
$sel_typepdt=mysql_query($req_sel_typepdt);
$type_pdt=mysql_fetch_assoc($sel_typepdt);
Et je voudrais réutiliser ce tableau dans la requête suivante (à la place de la table Produit):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$req_rech_mee="SELECTUtilisateur.Nom_Utilisateur,Utilisateur.Alias_Utilisateur,";
$req_rech_mee.="Utilisateur.Date_Connexion,Utilisateur.Heure_Connexion,";
$req_rech_mee.="Fiche_Suivi.Id_Fiche_Suivi,Fiche_Suivi.Id_Utilisateur,";
$req_rech_mee.="Produit.Id_Produit,Produit.Id_Affaire,Produit.Id_Type_Produit,";
$req_rech_mee.="Produit.Id_Fiche_Suivi,Produit.Code_Barre_Produit,";
$req_rech_mee.="Produit.Code_Configuration_Produit,Produit.Code_GPAO_Produit,";
$req_rech_mee.="Produit.NSU_Produit,Produit.Num_Parc,Affaire.Id_Affaire";
$req_rech_mee.=" FROM Utilisateur INNER JOIN Fiche_Suivi INNER JOIN Produit";
$req_rech_mee.=" INNER JOIN Affaire";
$req_rech_mee.=" ON Affaire.Id_Affaire=Produit.Id_Affaire ON";
$req_rech_mee.=" Produit.Id_Fiche_Suivi=Fiche_Suivi.Id_Fiche_Suivi ON";
$req_rech_mee.=" Fiche_Suivi.Id_Fiche_Suivi=Utilisateur.Id_Utilisateur";
$req_rech_mee.=" WHERE Produit.Id_Produit=Produit.Id_Produit";
Les deux requêtes marchent séparémment (ne faites pas attention aux retours à la ligne que je peux pas éviter à cause de mon copier/coller

Merci d'avance du coup de pouce
Je sais que c'est simple à faire, mais je trouve aucune aide sur les sujets déjà traités des forums.
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 11h09   #2
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Plutot que d'utiliser une police grasse pour différentier ton code de ton message, je te suggère plutot d'utiliser la balise [code] qui est la pour ça.

Merci d'avance.
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 11h11   #3
Membre actif
 
Inscription : septembre 2005
Messages : 183
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 183
Points : 175
Points : 175
Envoyer un message via Yahoo à polace
slt PedroBD, on n'a du mal à te saisir.Peux tu reformuler ta doléance.
en plus as tu besoin de découper ta requete. peux -tu en créer une uniquecela permettra de mieux lire.
__________________
la succession d'évènement que nous subissons toute notre vie n'est qu'un phénomène de compensation dont la nature en est l'arbitre.[Inéluctabilité de la nature ] Polace
polace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 11h18   #4
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Code :
1
2
3
4
5
6
7
8
9
10
$sql = <<<END
SELECT 
    Produit.Id_Produit,
    Produit.Id_Type_Produit,
    Type_Produit.Id_Type_Produit,
    Type_Produit.Nom_Type_Produit
FROM 
    Produit 
    INNER JOIN Type_Produit ON (Produit.Id_Type_Produit = Type_Produit.Id_Type_Produit)
END;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$sql = <<<END
SELECT
    Utilisateur.Nom_Utilisateur,
    Utilisateur.Alias_Utilisateur,
    Utilisateur.Date_Connexion,
    Utilisateur.Heure_Connexion,
    Fiche_Suivi.Id_Fiche_Suivi,
    Fiche_Suivi.Id_Utilisateur,
    Produit.Id_Produit,
    Produit.Id_Affaire,
    Produit.Id_Type_Produit,
    Produit.Id_Fiche_Suivi,
    Produit.Code_Barre_Produit,
    Produit.Code_Configuration_Produit,
    Produit.Code_GPAO_Produit,
    Produit.NSU_Produit,
    Produit.Num_Parc,
    Affaire.Id_Affaire
FROM 
    Utilisateur 
    INNER JOIN Fiche_Suivi ON (Fiche_Suivi.Id_Fiche_Suivi = Utilisateur.Id_Utilisateur)
    INNER JOIN Produit ON (Produit.Id_Fiche_Suivi = Fiche_Suivi.Id_Fiche_Suivi)
    INNER JOIN Affaire ON (Affaire.Id_Affaire = Produit.Id_Affaire) 
WHERE Produit.Id_Produit = Produit.Id_Produit
END;
C'est quand même plus lisible non ?
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 11h23   #5
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
Salut les gars et merci de vos réponses.

Ok, c'est cool pour la mise en forme carrément plus lisible. Maintenant je vais être plus clair:

1/J'execute en php la 1ère requête et je récupère un tableau avec 2/ Maintenant je voudrais inclure ce tableau dans la 2ème requête à la place de la table Produit (en gros remplacer la table Produit de la 2ème requête par ce tableu nouvellement créé).

Mon pb c'est qu'en PHP je connais pas la syntaxe exacte.

C'est plus clair comme ça?
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 11h37   #6
Membre régulier
 
Inscription : mars 2006
Messages : 92
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 92
Points : 90
Points : 90
faut faire une boucle sur ton tableau de résultat
monsieurjean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 11h40   #7
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
Aha...je comprends pas trop ce que tu veux dire; tu peux expliciter un peu plus ta solution STP?
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 12h28   #8
Membre actif
 
Inscription : septembre 2005
Messages : 183
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 183
Points : 175
Points : 175
Envoyer un message via Yahoo à polace
juste une précision cette ligne
Code :
INNER JOIN Fiche_Suivi ON (Fiche_Suivi.Id_Fiche_Suivi = Utilisateur.Id_Utilisateur)
ne serait pas plutot
Code :
INNER JOIN Fiche_Suivi ON (Fiche_Suivi.Id_Utilisateur = Utilisateur.Id_Utilisateur)
ou je me trompe peut être merçi de m'éclairer
__________________
la succession d'évènement que nous subissons toute notre vie n'est qu'un phénomène de compensation dont la nature en est l'arbitre.[Inéluctabilité de la nature ] Polace
polace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 12h40   #9
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
C'est cool, tu viens de me corriger une erreur, merci.

Pas d'idée sinon pour mon histoire de requête?
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 13h12   #10
Membre actif
 
Inscription : septembre 2005
Messages : 183
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 183
Points : 175
Points : 175
Envoyer un message via Yahoo à polace
je ne suis pas sure de ce que j'écris. alors j'attends des critiques.merçi d'avance.
voiçi ce que je propose.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql =" 
SELECT
    Produit.Id_Produit,
    Produit.Id_Type_Produit,
    Type_Produit.Id_Type_Produit,
    Type_Produit.Nom_Type_Produit
FROM
    Produit
    INNER JOIN Type_Produit ON (Produit.Id_Type_Produit = Type_Produit.Id_Type_Produit)";
$resultat=mysql_query($sql) ;or die(mysql_error());
while($row=mysql_fetch_assoc($resultat)){
$Id_Produit=$row['Id_produit'];
$Id_Type_Produit=$row['Id_Type_Produit'];
$Nom_Type_Produit=$row['Nom_Type_Produit']
}
et ensuite tu crées une table qui prend pour valeur le resultat de la requette précedente. à toi de voir le nouveau nom



__________________
la succession d'évènement que nous subissons toute notre vie n'est qu'un phénomène de compensation dont la nature en est l'arbitre.[Inéluctabilité de la nature ] Polace
polace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 13h35   #11
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
C'est pas con, je te remercie de ton aide.

Je vais essayer, mais je pense vraiment qu'il y a plus simple. En fait, j'ai même vu en cours un truc en SQL du style:

Code :
1
2
3
4
 
req1="SELECT .........";
 
req2=SELECT * FROM req1;
C'est pas tout à fait la syntaxe SQL exacte, mais c'est pas mon pb puisque moi je veux le faire en PHP. Si quelqu'un connait la structure à laquelle je fais allusion, qui doit être de la forme:

Code :
1
2
3
4
5
$req1="SELECT...FROM ....";
 
$exec_req1=mysql_query(req1);
 
$req2="SELECT ...... FROM $exec_req1 INNER JOIN..... "
Voilà, je vous remercie encore pour votre aide. C'est bien cool les forums quand on bloque sur son projet!
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 13h43   #12
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
Citation:
Envoyé par polace
je ne suis pas sure de ce que j'écris. alors j'attends des critiques.merçi d'avance.
voiçi ce que je propose.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql =" 
SELECT
    Produit.Id_Produit,
    Produit.Id_Type_Produit,
    Type_Produit.Id_Type_Produit,
    Type_Produit.Nom_Type_Produit
FROM
    Produit
    INNER JOIN Type_Produit ON (Produit.Id_Type_Produit = Type_Produit.Id_Type_Produit)";
$resultat=mysql_query($sql) ;or die(mysql_error());
while($row=mysql_fetch_assoc($resultat)){
$Id_Produit=$row['Id_produit'];
$Id_Type_Produit=$row['Id_Type_Produit'];
$Nom_Type_Produit=$row['Nom_Type_Produit']
}
et ensuite tu crées une table qui prend pour valeur le resultat de la requette précedente. à toi de voir le nouveau nom



En fait, j'ai fait comme ça au départ, mais le hic c'est que dans ma requête:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
$req_rech_mee="SELECT Utilisateur.Nom_Utilisateur,Utilisateur.Alias_Utilisateur,";
 $req_rech_mee.="Utilisateur.Date_Connexion,Utilisateur.Heure_Connexion,";
  $req_rech_mee.="Fiche_Suivi.Id_Fiche_Suivi,Fiche_Suivi.Id_Utilisateur,";
  $req_rech_mee.="Produit.Id_Produit,Produit.Id_Affaire,Produit.Id_Type_Produit,";
  $req_rech_mee.="Produit.Id_Fiche_Suivi,Produit.Code_Barre_Produit,";
  $req_rech_mee.="Produit.Code_Configuration_Produit,Produit.Code_GPAO_Produit,";
  $req_rech_mee.="Produit.NSU_Produit,Produit.Num_Parc,Affaire.Id_Affaire";
  $req_rech_mee.=" FROM Utilisateur INNER JOIN Fiche_Suivi INNER JOIN Produit";
  $req_rech_mee.=" INNER JOIN Affaire";
  $req_rech_mee.=" ON Affaire.Id_Affaire=Produit.Id_Affaire ON";
  $req_rech_mee.=" Produit.Id_Fiche_Suivi=Fiche_Suivi.Id_Fiche_Suivi ON";
  $req_rech_mee.=" Fiche_Suivi.Id_Utilisateur=Utilisateur.Id_Utilisateur";
  $req_rech_mee.=" WHERE Produit.Id_Produit=Produit.Id_Produit";
Je fais pas d'inner join sur la table Type_Produit. Donc je récupère pas Nom_Type_Produit, ce qui fait que ta solution peut pas marcher, vu qu'après avoir fait
Code :
$Nom_Type_Produit=$row['Nom_Type_Produit']
je peux pas m'en resservir dans la 2nde requête. Tu me suis?
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 14h24   #13
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Quel est ta version de MySQL ?
Quel est le lien entre les deux requetes ?
Que fait la première requete ?
Est-ce que tu fais autre chose sur la première requete (Les types servent-ils) ?
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 15h05   #14
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
Merci de ton aide, voici les réponses:

Citation:
Envoyé par Mr N.
Quel est ta version de MySQL ?
- J'ai MySQL 5.0.15

Citation:
Envoyé par Mr N.
Quel est le lien entre les deux requetes ?
- Pour être répondre plus clairement, voici un peu de mon MPD:
D'abord, j'ai les 4 tables suivantes liées directement entre elles:

Utilisateur
- Id_Utilisateur
- Nom_Utilisateur
- Alias_Utilisateur
- Date_Connexion
- Heure_Connexion

Fiche_Suivi
- Id_Fiche_Suivi
- Id_Utilisateur

Produit
- Id_Produit
- Id_Affaire
- Id_Type_Produit
- Id_Fiche_Suivi
- Code_Barre_Produit
- Code_Configuration_Produit
- Code_GPAO_Produit

Affaire
- Id_Affaire
- Nom_Affaire
- Numero_Affaire
- Adresse_Affaire

Ensuite la table j'ai la table Type_Produit, qui n'est liée qu'à Produit:
Type_Produit
- Id_Type_Produit
- Nom_Type_Produit

La 1ère requète crée une 1ère table contenant des Id et nom de types de produits:

Code :
1
2
3
4
$req_sel_typepdt="SELECT Produit.Id_Produit,Produit.Id_Type_Produit,";
$req_sel_typepdt.="Type_Produit.Id_Type_Produit,Type_Produit.Nom_Type_Produit";
$req_sel_typepdt.="FROM Produit INNER JOIN Type_Produit ON ";
$req_sel_typepdt.="Produit.Id_Type_Produit=Type_Produit.Id_Type_Produit";
La seconde requête crée une nouvelle table contenant toutes les informations récupérées par les INNER JOIN et je voudrais m'appuyer sur la table créée à la 1ère requête pour ajouter dans cette grande table les noms des types de produits.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$req_rech_mee="SELECTUtilisateur.Nom_Utilisateur,Utilisateur.Alias_Utilisateur,";
$req_rech_mee.="Utilisateur.Date_Connexion,Utilisateur.Heure_Connexion,";
$req_rech_mee.="Fiche_Suivi.Id_Fiche_Suivi,Fiche_Suivi.Id_Utilisateur,";
$req_rech_mee.="Produit.Id_Produit,Produit.Id_Affaire,Produit.Id_Type_Produit,";
$req_rech_mee.="Produit.Id_Fiche_Suivi,Produit.Code_Barre_Produit,";
$req_rech_mee.="Produit.Code_Configuration_Produit,Produit.Code_GPAO_Produit,";
$req_rech_mee.="Produit.NSU_Produit,Produit.Num_Parc,Affaire.Id_Affaire";
$req_rech_mee.=" FROM Utilisateur INNER JOIN Fiche_Suivi INNER JOIN Produit";
$req_rech_mee.=" INNER JOIN Affaire";
$req_rech_mee.=" ON Affaire.Id_Affaire=Produit.Id_Affaire ON";
$req_rech_mee.=" Produit.Id_Fiche_Suivi=Fiche_Suivi.Id_Fiche_Suivi ON";
$req_rech_mee.=" Fiche_Suivi.Id_Fiche_Suivi=Utilisateur.Id_Utilisateur";
$req_rech_mee.=" WHERE Produit.Id_Produit=Produit.Id_Produit";
Citation:
Envoyé par Mr N.
Que fait la première requete ?
- Je pense que tu as la réponse maintenant

Citation:
Envoyé par Mr N.
Est-ce que tu fais autre chose sur la première requete (Les types servent-ils) ?
- Ben sur la 1ère requête je vois pas ce que je pourrais faire de plus et le type de produit me sert, vu que je veux l'inclure dans la grande table créée à la seconde requête pour l'afficher.
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 15h13   #15
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Pourquoi ne ferais-tu pas une seule requête ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
$sql = <<<END
SELECT
    Utilisateur.Nom_Utilisateur,
    Utilisateur.Alias_Utilisateur,
    Utilisateur.Date_Connexion,
    Utilisateur.Heure_Connexion,
    Fiche_Suivi.Id_Fiche_Suivi,
    Fiche_Suivi.Id_Utilisateur,
    Produit.Id_Produit,
    Produit.Id_Affaire,
    Produit.Id_Type_Produit,
    Produit.Id_Fiche_Suivi,
    Produit.Code_Barre_Produit,
    Produit.Code_Configuration_Produit,
    Produit.Code_GPAO_Produit,
    Produit.NSU_Produit,
    Produit.Num_Parc,
    Affaire.Id_Affaire,
    Type_Produit.Id_Type_Produit,
    Type_Produit.Nom_Type_Produit
FROM
    Utilisateur
    INNER JOIN Fiche_Suivi ON (Fiche_Suivi.Id_Utilisateur = Utilisateur.Id_Utilisateur)
    INNER JOIN Produit ON (Produit.Id_Fiche_Suivi = Fiche_Suivi.Id_Fiche_Suivi)
    INNER JOIN Type_Produit ON (Produit.Id_Type_Produit = Type_Produit.Id_Type_Produit)
    INNER JOIN Affaire ON (Affaire.Id_Affaire = Produit.Id_Affaire)
WHERE Produit.Id_Produit = Produit.Id_Produit
END;
:
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 15h25   #16
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
Je croyais qu'on pouvait pas tout faire directement, mais si tu me dis que ça marche, je vais essayer.

Merci
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 16h21   #17
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
Ca a l'air bon comme ça, merci bcp! N'empêche que la question de la requête dans la requête n'est pas résolue...je suis sûr que l'on peut faire un truc du style:

et plus loin

Code :
$req2="SELECT...... FROM $req1";

Peut-être que d'autres personnes se posent la question.

Si quelqu'un sait, ça peut toujours être utile!
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 16h41   #18
Expert Confirmé Sénior
 
Avatar de Mr N.
 
Inscription : septembre 2004
Messages : 5 421
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 421
Points : 5 835
Points : 5 835
Code :
1
2
3
4
5
6
R1 = SELECT * FROM A
R2 = SELECT * FROM R1
 
=> 
 
SELECT * FROM (SELECT * FROM A) as R1
A voir si c'est possible en fonction de ta version de MySQL
Mr N. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 08h26   #19
Membre à l'essai
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 24
Points : 24
En MySQL ok, mais tu connais la syntaxe en php?
PedroBD est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h00.


 
 
 
 
Partenaires

Hébergement Web