Selectionner plusieurs champs de plusieurs tables

Fermé
silverboy95 Messages postés 14 Date d'inscription samedi 15 mars 2014 Statut Membre Dernière intervention 24 février 2015 - Modifié par jordane45 le 23/02/2015 à 18:45
max83000 Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre Dernière intervention 28 février 2015 - 25 févr. 2015 à 14:14
J'ai un problème avec une requete sql j'arrive pas a trouver la bonne requête sure cette question si vous pourriez m'aidez au plus rapidement ...
Merci a tous
"Pour chaque fiche de frais, afficher les nom et prénom du visiteur, l'année, le mois et les 4 montants de ligne de frais."

Et ici la base de donnée :
"CREATE DATABASE gsbfrais;
USE gsbfrais;

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

<signature>-- Suppression préalable des tables si nécessaire
--
DROP TABLE IF EXISTS `lignefraishorsforfait`;
DROP TABLE IF EXISTS `lignefraisforfait`;
DROP TABLE IF EXISTS `fichefrais`;
DROP TABLE IF EXISTS `visiteur`;
DROP TABLE IF EXISTS `etat`;
DROP TABLE IF EXISTS `fraisforfait`;

--
-- Structure de la table `fraisforfait`
--
CREATE TABLE IF NOT EXISTS `fraisforfait` (
  `id` char(3) NOT NULL,
  `libelle` char(20) DEFAULT NULL,
  `montant` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;


-- --------------------------------------------------------

--
-- Structure de la table `etat`
--
CREATE TABLE IF NOT EXISTS `etat` (
  `id` char(2) NOT NULL,
  `libelle` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

-- --------------------------------------------------------

--
-- Structure de la table `visiteur`
--
CREATE TABLE IF NOT EXISTS `visiteur` (
  `id` char(4) NOT NULL,
  `nom` char(30) DEFAULT NULL,
  `prenom` char(30)  DEFAULT NULL, 
  `login` char(20) DEFAULT NULL,
  `mdp` char(20) DEFAULT NULL,
  `adresse` char(30) DEFAULT NULL,
  `cp` char(5) DEFAULT NULL,
  `ville` char(30) DEFAULT NULL,
  `dateEmbauche` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;


-- --------------------------------------------------------

--
-- Structure de la table `fichefrais`
--
CREATE TABLE IF NOT EXISTS `fichefrais` (
  `idVisiteur` char(4) NOT NULL,
  `mois` char(6) NOT NULL,
  `nbJustificatifs` int(11) DEFAULT NULL,
  `montantValide` decimal(10,2) DEFAULT NULL,
  `dateModif` date DEFAULT NULL,
  `idEtat` char(2) DEFAULT 'CR',
  PRIMARY KEY (`idVisiteur`,`mois`),
  FOREIGN KEY (`idEtat`) REFERENCES etat(`id`),
  FOREIGN KEY (`idVisiteur`) REFERENCES visiteur(`id`)
) ENGINE=InnoDB;


-- --------------------------------------------------------

--
-- Structure de la table `lignefraisforfait`
--
CREATE TABLE IF NOT EXISTS `lignefraisforfait` (
  `idVisiteur` char(4) NOT NULL,
  `mois` char(6) NOT NULL,
  `idFraisForfait` char(3) NOT NULL,
  `quantite` int(11) DEFAULT NULL,
  PRIMARY KEY (`idVisiteur`,`mois`,`idFraisForfait`),
  FOREIGN KEY (`idVisiteur`, `mois`) REFERENCES fichefrais(`idVisiteur`, `mois`),
  FOREIGN KEY (`idFraisForfait`) REFERENCES fraisforfait(`id`)
) ENGINE=InnoDB;

-- --------------------------------------------------------

--
-- Structure de la table `lignefraishorsforfait`
-- Rajout de l'état de remboursement car il peut être remboursé jusqu'à 1 an après
--
CREATE TABLE IF NOT EXISTS `lignefraishorsforfait` (
  `id` int(11) NOT NULL auto_increment,
  `idVisiteur` char(4) NOT NULL,
  `mois` char(6) NOT NULL,
  `libelle` varchar(100) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `montant` decimal(10,2) DEFAULT NULL,
  `idEtat` char(2) DEFAULT 'CR',
  PRIMARY KEY (id),
  FOREIGN KEY (`idVisiteur`, `mois`) REFERENCES fichefrais(`idVisiteur`, `mois`),
  FOREIGN KEY (`idEtat`) REFERENCES etat(`id`)
) ENGINE=InnoDB;



EDIT : Ajout des balises de code

"</signature>

2 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
23 févr. 2015 à 18:54
Bonjour,

Il faut utiliser des jointures.
par exemple :
SELECT V.nom
     , V.prenom
	 , F.mois
	 , F.montantValide
	 , F.dateModif

FROM fichefrais F
LEFT JOIN visiteur V ON V.id = F.idVisiteur


Par contre.. je ne trouve pas quelle est la relation entre tes autres tables.... donc je ne sais pas quelles id utiliser pour les jointures...
N'aurais tu pas d'autres tables qui feraient la liaison entre ta table fichefrais et les autres ???

En même temps... pourquoi avoir fait autant de table (pour les types de frais..)?
Une seule table avec un champ "type_de_frais" .. aurait suffit !
0
silverboy95 Messages postés 14 Date d'inscription samedi 15 mars 2014 Statut Membre Dernière intervention 24 février 2015
23 févr. 2015 à 23:38
Merci de ta reponse,
je sais mais c'est un exercice je peut rien modifier on ma dit qu'il faut utilise v1, v2 ou FF mais je sais pas a quoi sa correspond je suis perdue.
Si tu a une adresse mail ou autre je t'envoie le tout parce que la base de donnée est super longue avec le champs des client etc ...
Cordialement
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
23 févr. 2015 à 23:56
c'est un exercice je peut rien modifier on ma dit qu'il faut utilise v1, v2 ou FF mais je sais pas a quoi sa correspond je suis perdue.

Si tu ne comprend pas l'énoncé... le plus simple (et le plus sûr...) est de demander des explications à ton prof.

Par contre... en regardant de nouveau tes tables.. les champs utilisés pour les jointures apparaissent assez clairement..

Par exemple :
Entre la table lignefraishorsforfait et fichefrais ... utilisation des champs : (`idVisiteur`, `mois`)
Entre la table lignefraisforfait le champ `idFraisForfait` fait REFERENCES à la table fraisforfait champ :`id`
etc....( regarde les Foreign Key de tes tables )

Tu peux donc compléter les jointure comme cela par exemple :
SELECT *
FROM fichefrais F
LEFT JOIN visiteur V ON V.id = F.idVisiteur
LEFT JOIN lignefraishorsforfait LHF  ON LHF.idVisiteur = F.idVisiteur AND LHF.mois = F.mois
LEFT JOIN lignefraisforfait LFF  ON LFF.idVisiteur=F.idVisiteur AND LFF.mois = F.mois
LEFT JOIN  fraisforfait FF ON FF.id = LFF.idFraisForfait
0
silverboy95 Messages postés 14 Date d'inscription samedi 15 mars 2014 Statut Membre Dernière intervention 24 février 2015 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
24 févr. 2015 à 00:07
Malheureusement malgré ses explication j'ai du mal a comprend et je veux pas être pénalisé sur mon semestre ...
Oui je vois mais je comprend pas les "4 montant ligne frais ", left join j'y arrive mais c'est pas mieux d'utiliser INNER ?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié par jordane45 le 24/02/2015 à 00:12
c'est pas mieux d'utiliser INNER

Ca dépend du besoin....

Regardes ces liens :
https://www.commentcamarche.net/faq/34631-mysql-quelle-jointure-choisir

https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/916084-les-jointures-entre-tables

http://www.areaprog.com/sql/cours-308-les-jointures-inner-join-left-right-et-full-outer-join
0
max83000 Messages postés 8 Date d'inscription mercredi 25 février 2015 Statut Membre Dernière intervention 28 février 2015
25 févr. 2015 à 14:14
avec left join si une table n'est pas rempli ca rend un resultat (si ya 0 ligne de frais hors forfait ca retourne quand meme quelquechose)

inner de memoire ca met une liaison obligatoire qui ne te retourne l'objet que si yen a au moins un
0