Requete sql sur 3 tables liés

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Requete sql sur 3 tables liés

par newby » 22 janv. 2008, 21:45

tout a fait ,c'est d'ailleurs du petit lien que tu as envoyé que j'ai construit ma requete et qui presente bien l'erreur precedente!!
je n'arrive pas a comprendre comment procédé.merci a toi

par Berzemus » 21 janv. 2008, 22:57

"normal join" ? A ce que j'en sais, ça n'existe pas. Tu as un lien vers ta doc ?

Tu as du confondre avec "natural join", ou il suffit de specifier le nom de la table (using) (petit lien)

par newby » 21 janv. 2008, 19:46

La derniere requete precedente marche tout a fait et revnoit le resultat attendu.

Maintenant ,je voudrais pousser le bouchon un peu plus loin,etant donné que mes noms de colonnes siont identiques entre deux tables liés,j'ai voulu utilisé NORMAL JOIN qui selon la documentation permet d'eviter de preciser les champs qui sont identiques .

Ma requete est du style

SELECT A.PrixTtc as PrixTtc,B.NomIntitule as NomIntitule,B.DesignationIntitule as DesignationIntitule enumereprixamiante as A NORMAL JOIN enumereintituleprestation as B NORMAL JOIN enumerenbrepiece as C WHERE C.TitrePiece="Maison"

cependant celle ci ne marche pas et sql me renvoit l'erreur suivante:
MySQL a répondu:Documentation
#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 'enumereprixamiante as A NORMAL JOIN enumereintituleprestation as B NORMAL JOIN ' at line 1

quelqu'un aurait il une idée svp?
merci

par Berzemus » 21 janv. 2008, 13:50

"utiliser les tables " ? ahbon.

Simplement sélectionner la DB, et simplement aller dans "SQL" devrait très bien aller; pas besoin de préselectionner des tables..

par newby » 21 janv. 2008, 13:06

merci encore pour vos consiels avisé
ma requete finale pares mure reflexion serait donc :

SELECT A.PrixTtc as PrixTtc,B.NomIntitule as NomIntitule,B.DesignationIntitule as DesignationIntitule FROM enumereprixernt as A INNER JOIN enumereintituleprestation as B ON (A.IdIntitule=B.IdIntitule) INNER JOIN enumerenbrepriece as C ON (A.IdPiece=C.IdPiece) WHERE C.TitrePiece=F1

J'ai pris F1 comme resultat de ce que me renverrait mon formulaire .

Mais dans php my admin,je n'arrive pas a tester je clique sur ma base de donnée et choisit requete et je selectionne mes 3 tables dans lm'encadré UTILISER LES TABLES et j'ecrit ma requete dans l'encadre REQUETE SQL DANS LA TABLE et j'ai choisit pour les champs
enumereprixernt,PrixTtc
enumereintutleprestation,NomPrestation
enumereintituleprestation,DesignationPrestation

il reaffiche ma page avec ma requete modifié tel que :
SELECT `enumereprixernt`.`PrixTtc`
FROM enumereprixernt, enumereintituleprestation
et un joli message d'erreur :
Vous devez choisir au moins une colonne à afficher

Ou ai je fauté??
merci

par Berzemus » 19 janv. 2008, 11:59

Ah oui, alias.. et ça évite les erreurs quand on utilise des noms à rallonge, que je conseillerais d'éviter pour allourdir son script.

par Hubert Roksor » 19 janv. 2008, 02:45

Concernant ce "renommage", le terme exact est "alias", qui, comme son nom l'indique, consiste à se référer à une chose par autre nom que le sien. Ça évite les quiproquos.

par Berzemus » 19 janv. 2008, 01:38

C'est juste au niveau de la requête, le rennomage; moins tu écris, moins tu risques de faire des fautes. Donc quand on peut s'éviter des efforts, faut pas hésiter :wink:

Un simple inner join devrait suffire. Tu as essayé ma requête dans phpmyadmin ? est-ce que les résultats ne conviennent pas ?

Pour ce qui est de tes premières questions (que je viens de relire :wink: ):
1) l'importance des colonnes n'a de l'importance que pour toi; Pour la db et pour le script, c'est du pareil au même.

3) pour lire les résultats, regarde du côté de mysql_fetch_assoc.


Et le 2, ben il est en cours :wink:

par newby » 18 janv. 2008, 23:32

je viens de parcourir un pue le net et je viens de voir que Natural join serait parfait appremment car j'ai bien des noms de colonne identique entre les deux tables.


Qu'en pense tu ?Et je voulais savoir quand tu parlais de renommer directement les tables avec AS ,est ce que ca modifiera leurs noms au sein de ma abse de donnée ou est ce juste une maniere d'etre plus lisible au sein de ma requete .Eb effet je evux qu'elle garde le meme nom .
merci d'avance.

par Berzemus » 18 janv. 2008, 17:37

Alors il suffit de mettre un JOIN pour que MySQL puisse s'y retrouver..

Code : Tout sélectionner

SELECT A.NomIntitule as NomIntitule, A.DesignationIntitule as DesignationIntitule,C.PrixTtc as PrixTtc FROM enumereintituleprestation as A INNER JOIN enumereprixforfait1 as C ON( A.idIntitule = C.idIntitule) WHERE C.idPiece='".$_POST['NbrePIeceSelectionneParFormulaire']."' AND A.NomInituleprestation='".$_POST['NbreDePrestationSelectionneParFormulaire']."' ";

par newby » 18 janv. 2008, 16:23

enumereprixforfait1 presente une colonne qui porte le meme nom (idIntitule) que la colonne (idIntitule) de la table enumereintituleprestation.Tout simplement car je peux mettre dans la colonne l'identifiant qui correpond au type de prestatin qui doit etre realisé.

Regarde les insert inot d'exemple tout en haut et demande des expliquations afin que je puisse t'aider à mieux cerner ..

je l'ai fait expres car je vais avoir une vingtaine de formule a proposer en tout .


merci a toi

par Berzemus » 18 janv. 2008, 15:59

Est-que dans enumereintituleprestation et enumereprixforfait1 il y a une valeur qui permettrait de lier les tables entre eux ? (genre un numéro d'identification ou quelque chôse comme ça)

par newby » 18 janv. 2008, 15:39

argh je deviens fou ,je viens d epenser que mon $_post me renvoyait du texte et non un identifiant:
en fait pour mon select box va puisé les noms qu'il propose dans la table enumerenbrepiece.


donc il faut d'abord que je compare le texte renvoyé par mon select box et j'en trouve un identifant idPiece et ensuite je cherche dans ma table enumereprixforfait1 la ligne qui me propose cet identifiant idPiece

Code : Tout sélectionner

SELECT enumereinituleprestation.NomIntitule,enumereintituleprestation.DesignationIntitule,enumereprixforfait1.PrixTtc FROM enumereintituleprestation,enumereprixforfait1 WHERE enumerenbrepiece.TitrePiece='".$_POST['NbrePIeceSelectionneParFormulaire']."' est ce que mysql va comprendre qu'il doit se basé sur cet identifiant?? merci

par newbie » 18 janv. 2008, 15:28

je viens de comprendre pourquoi tu me demandais ce que venais faire le enumerenbrepiece dans ma requete

en effet ,elle ne me sert a rien car je n'y recherche rien , je voulais juste obtenir la reference ,designation et le prix d'une prestation en fonction du nbre de piece selectionné par l'utilisateur dans son select box.

donc d'apres toi il m'est inutile de l'intorduireapres le from .ma requete peut etre donc plus simplement:

Code : Tout sélectionner

SELECT enumereinituleprestation.NomIntitule,enumereintituleprestation.DesignationIntitule,enumereprixforfait1.PrixTtc FROM enumereintituleprestation,enumereprixforfait1 WHERE enumereprixforfait1.idPiece='".$_POST['NbrePIeceSelectionneParFormulaire']."'
ai je raison ou trot??merci d'avance

par newby » 18 janv. 2008, 15:14

en fait a la base ces trois tables etaient reunies en une seule de la forme suivante:

Code : Tout sélectionner

CREATE TABLE `enumereprixaormule1` ( `id` int(6) NOT NULL auto_increment, `Reference` text NOT NULL, `Designation` text NOT NULL, `NbrePiece` varchar(10) NOT NULL, `PrixTtc` float NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; -- -- Contenu de la table `enumereprixformule1` -- INSERT INTO `enumereprixformulae1` (`id`, `Reference`, `Designation`, `NbrePiece`, `PrixTtc`) VALUES (1, 'Amiante', 'Repérage des produits et matériaux susceptibles de contenir de l''amiante', 'F1', 30), (2, 'Amiante', 'Repérage des produits et matériaux susceptibles de contenir de l''amiante', 'F2', 40), (3, 'Amiante', 'Reperage des produits et materiaux susceptibles de contenir de l''amiante', 'F3', 50), (4, 'Amiante', 'Reperage des produits et materiaux susceptibles de contenir de l''amiante', 'F4', 60), (5, 'Amiante', 'Reperage des produits et materiaux susceptibles de contenir de l''amiante', 'F5', 70), (6, 'Amiante', 'Reperage des produits et materiaux susceptibles de contenir de l''amiante', 'Maison', 70);
et ma requete etait tout simplmetn la suivante:

Code : Tout sélectionner

SELECT Reference,Designation,PrixHt,PrixTtc from `enumereprixformule1` WHERE NbrePiece='".$_POST['nbrepiecebien']."'";
je me suis un peu embrouikillé l'esprit avec les tables liés et je pensais que je devais recupéré avec le AND quelque chose alors que ce n'est pas tuile.

peut tu m'en dire plus sur la facon dont tu renommes les tables et tes histoires de A B C et as car sur le site l'altruiste.com ,il part directement des requetes complexes !!
d'avance merci de ta part.[/code]