PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 15-07-2010 14:34:01

honey0
Membre
Inscription : 15-07-2010
Messages : 25

sélection sur plusieurs tables mysql

Bonjour,
je suis débutante en mysql et je bloque sur un problème, je travaille avec phpmyadmin..
voilà, j'ai 4 tables: "personne", "absences", "demande", "activite".

la table "personne" répertorie toutes les personnes connues par le système, la table "activite" comprend le projets sur lesquels elles ont travaillé, la table demande comprend les demandes adressées au services (et on y souvent, pas obligatoirement, le chef de projet), et la table "absences", c'est les absences.
j'aimerai afficher toutes les informations sur une personne sous forme d'un tableau en php. sachant que ces informations se trouvent dans ces 4 tables différentes, je ne sais pas trop comment construire la requête.
j'avais dans l'idée de faire une jointure entre les tables sur la condition du nom (récupéré par un formulaire). Mais la personne peut ne pas se trouver dans l'une de ces tables, et dans ce cas je ne veux pas afficher les champs correspondants.
Finaklement j'ai décidé de faire étape par étape en faisant des vues intermédiaires. J'ai d'abord fait une vue sur la table "personne", mais la requête me renvoie une erreur.

voila mes 2 requêtes pour l'instant :
[c] $table0 = mysql_query('CREATE VIEW latable AS select * from personne where nom="'.$nom.'" and prenom="'.$prenom.'"');

     $condition = mysql_fetch_array($table0); [/c]

j'ai l'erreur suivante:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource 

Après les heures passées à faire du php, je sais que c'est la requête de "$table0" qui pose problème.

j'espère avoir de l'aide, merci d'avance pour vos réponses

Dernière modification par honey0 (15-07-2010 14:36:30)

Hors ligne

#2 15-07-2010 15:54:51

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : sélection sur plusieurs tables mysql

tu veux créer une vue ??
sinon, tout simplement :
[code:php]
$table0 = mysql_query("SELECT * FROM personne WHERE nom='$nom' and prenom='$prenom'");
[/code]

a++

Hors ligne

#3 15-07-2010 17:17:27

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : sélection sur plusieurs tables mysql

Saluton,
Une vue n'a guère d'intérêt dans le cas précis.
D'autant que : La guerre des étoiles.
Sinon, une fois la vue créée, encore faut-il l'interroger comme s'il s'agissait d'une table et récupérer une ressource via mysql_query()
ressource que tu pourras alors parcourir avec les fonctions de la famille mysql_fetch.
A moins, encore plus meilleur, que tu n'instancies un objet PDO.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#4 16-07-2010 08:00:05

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

salut!
merci pour vos réponses.

Mais si je laisse l'idée de créer la vue, et que je veuille faire:
avoir le nom, prénom de la personne (table personne) avec les absences qu'elle a eu (table absence), les demandes qui la concernent (table demande) et les activités auxquelles elle a participé (table activite). Est-ce que je peux faire une requête comme ça:

$nom_complet = "$prenom $nom";

$variable = mysql_query("select p.nom, p.prenom, d.code, d.date, ab.date, ab.nature, ac.projet
                                                  from personne , absences ab, demande d, activite ac where
                                                            p.nom='$nom' and p.prenom='$prenom' and ab.nom='$nom' and ab.prenom='$prenom'
                                                            and d.acteur='$nom_complet' and ac.acteur='$nom_complet'" );

mais le problème avec cette requête est qu'elle ne me renverrai rien s'il y a une seule des conditions qui n'est pas remplie, or moi je veux qu'elle me renvoie celles qui sont remplies (car le nom est forcément dans la table personne, c'est à partir d'une liste déroulante du contenu de cette table que l'on a choisi la personne à chercher).
Avec des "or" à la place des "AND" je ne vois pas trop ce que ça peut donner.

PS: j'avais mis * pour ne pour faire court ici, sinon je préciserai les champs dont j'ai besoin.

bonne matinée

Hors ligne

#5 16-07-2010 10:49:44

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

je crois j'ai une idée, mais elle n'est pas très aboutit.

Dans la table "personne", je mets comme clé un id_acteur, et dans les 3 autres tables j'aurai ce champ comme clé étrangère sur la table "personne". Dans la requête, je fais une jointure:

   $variable = mysql_query('select * from personne AS p LEFT JOIN activite AS ac ON p.id = ac.id
                                         LEFT JOIN demande AS d ON p.id = d.id
                                         LEFT JOIN absences AS ab ON p.id = ab.id ');  
   $resultat = mysql_fetch_assoc($variable);

je ne l'ai pas encore essayé, je change le schéma de ma base puis je l'essaie. Je ne sais pas si c'est correct et si on peut faire des jointures multi-tables de la sorte, dîtes le si vous voyez un truc bizarre:D.

a +

Hors ligne

#6 16-07-2010 21:06:17

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : sélection sur plusieurs tables mysql

Bonjour,

Y a du progrès avec ta jointure à gauche, tu es sur la bonne voie. Pour arriver à ton résultat il faut que la table à gauche de ta jointure contienne d'une manière certaine toutes les personnes, et les tables à droite celles où des personnes peuvent ne pas s'y trouver.

Pour ta requête il sera necessaire de corriger ta syntaxe comme suit

SELECT p.champ1, d.champs2 FROM table1 AS p, table2 AS d

si tu veux ne pas recontrer d'erreur.

De plus pour ta clause where travaille sur tes clés primaires, cela suffit et évite de travailler sur x indexs autorisant les doublons par table.

Bonne continuation.

Dernière modification par Jc (16-07-2010 21:09:01)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 19-07-2010 09:30:35

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

Bonjour Jc et merci pour ta réponse.
En effet, la table de gauche (personne) contient toutes les personnes car j'ai une interface à partir de laquelle je choisis la personne dans une liste déroulant alimentée par cette table.
si je fais la syntaxe que tu m'as conseillée, j'ai une boucle infinie et les champs des tables "demande" et "activite" ne s'affichent pas.
voila ce que j'ai fait, avec en plus la récupération du nom pour avoir l'id correspondant afin de faire la comparaison:

if (isset($_POST['personne']))                  //envoi par post
   $personne = $_POST['personne'];

$lid1 = mysql_query('select id from personne where acteur="'.$personne.'"');
$lid2 = mysql_fetch_assoc($lid1);
if ($lid2)
    $identif = $lid2['id'];

            //requête principale
$rekete = mysql_query(' select p.email, d.libelle, ab.date_debut, ab.date_fin, ab.nature, ac.code_application, ac.version_application,
                               ac.TM, ac.version_TM, ac.etat_TM, d.application, d.version_application
          from personne AS p, absences AS ab, demande AS d, activite AS ac
                where   p.id="'.$identif.'" and
             ac.id_acteur_pack = p.id or
            ac.id_acteur_qualif = p.id or
                                                d.id_acteur_cpi = p.id or
            ab.id = p.id');
     
$resultat = mysql_fetch_assoc($rekete);

et dans la clause where, comment je peux travailler sur les clés primaires? j'ai besoin de l'égalité entre les clés secondaires de chacune des 3 autres tables avec la clé primaire de la table "personne". Les clés primaires des autres tables n'interviennent donc pas, à moins que je ne me trompe.

Hors ligne

#8 19-07-2010 14:39:09

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

Bonsoir,
après maintes essais, j'ai finalement affiché les informations en 3 fois? C'est à dire, les informations du profil et des absences dans un tableau, celles des projets sur lesquels l'acter a travaillé dans une 2nd, et les demandes le concernant dans un autre.
J'avais déjà implémenté cette solution, mais j'ai voulu tout affiché ensemble.

merci pour vos interventions et vos conseils.

bye!

Hors ligne

#9 19-07-2010 14:45:28

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

quelqu'un saurait où se situe le bouton "résolu"?????????? hmm

Hors ligne

#10 19-07-2010 20:10:14

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : sélection sur plusieurs tables mysql

Bonjour,

Visiblement tu as mal compris, pour t'aider d'une manière efficace, si tu pouvais me donner la structure de tes 3 tables et me donner les informations que tu désires afficher dans l'ensemble. Il est important aussi que sur les colonnes que tu désires afficher dans ta requête contenant les 3 tables, que tu me dises pour chaque colonne si elle accepte une valeur NULL par défaut.

Je te sens pas mal perdue, mais sans ces infos, je ne pourrais rien faire de plus.

A bientôt de te lire.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#11 20-07-2010 10:29:54

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

Bonjour Jc

voilà les tables que j'ai créées:

table "activite"

CREATE TABLE IF NOT EXISTS `activite` (
  `code_activite` int(11) NOT NULL AUTO_INCREMENT,
  `code_demande` int(11) DEFAULT NULL,
  `code_application` varchar(3) DEFAULT NULL,
  `version_application` varchar(8) DEFAULT NULL,
  `TM` varchar(2) DEFAULT NULL,
  `version_TM` varchar(8) DEFAULT NULL,
  `etat_TM` varchar(30) DEFAULT NULL,
  `etat_pack` varchar(30) DEFAULT NULL,
  `etat_qualif` varchar(30) DEFAULT NULL,
  `type_activite` varchar(50) DEFAULT NULL,
  `ordonnancement` varchar(3) NOT NULL,
  `id_acteur_pack` int(11),
  `id_acteur_qualif` int(11),
  `plate_forme` varchar(50) DEFAULT NULL,
  `charge` int(5) DEFAULT NULL,
  `client_lourd` varchar(3) DEFAULT NULL,
  `nouveau_module` varchar(3) DEFAULT NULL,
  `technologie` varchar(50) DEFAULT NULL,
  `mode_reception` varchar(10) DEFAULT NULL,
  `date_envoi` date DEFAULT NULL,
  `commentaires` longtext,
  PRIMARY KEY (`code_activite`),
  KEY `code_application` (`code_application`),
  KEY `type_activite` (`type_activite`),
  KEY `TM` (`TM`),
  KEY `plate_forme` (`plate_forme`),
  KEY `etat_TM` (`etat_TM`,`etat_pack`,`etat_qualif`),
  KEY `id_acteur_pack` (`id_acteur_pack`),
  KEY `id_acteur_qualif` (`id_acteur_qualif`),
  KEY `technologie` (`technologie`),
  KEY `mode_reception` (`mode_reception`),
  KEY `version_application` (`version_application`)
) ;

table "demande"

CREATE TABLE IF NOT EXISTS `demande` (
  `code_demande` int(11) NOT NULL AUTO_INCREMENT,
  `libelle` longtext NOT NULL,
  `demandeur` varchar(50) DEFAULT NULL,
  `application` varchar(100) DEFAULT NULL,
  `version_application` varchar(8) DEFAULT NULL,
  `id_acteur_cpi` int(11) ,
  `debut_demande` date DEFAULT NULL,
  `fin_demande` date DEFAULT NULL,
  `numero_gesdem` varchar(10) NOT NULL,
  `fingesdem` date NOT NULL,
  `etat_demande` varchar(30) DEFAULT NULL,
  `date_protocole` date DEFAULT NULL,
  `etat_protocole` varchar(30) NOT NULL,
  `date_bilan` date DEFAULT NULL,
  `etat_bilan` varchar(30) NOT NULL,
  `mode_reception` varchar(30) DEFAULT NULL,
  `QC` enum('OUI','NON') DEFAULT NULL,
  `impact` varchar(15) DEFAULT NULL,
  `commentaires` longtext,
  PRIMARY KEY (`code_demande`),
  KEY `etat_demande` (`etat_demande`),
  KEY `etat_protocole` (`etat_protocole`),
  KEY `etat_bilan` (`etat_bilan`),
  KEY `id_acteur_cpi` (`id_acteur_cpi`),
  KEY `mode_reception` (`mode_reception`)
);

table "absences"

 
CREATE TABLE IF NOT EXISTS `absences` (
  `id` int(11) ,
  `nature` varchar(20) NOT NULL,
  `date_debut` date NOT NULL,
  `date_fin` date NOT NULL,
  );

et la table "personne"

CREATE TABLE IF NOT EXISTS `personne` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `acteur` varchar(50) NOT NULL,
  `profil` varchar(30) NOT NULL,
  `email` varchar(50) NOT NULL,
  `pwd` varchar(30) NOT NULL,
  `telephone` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ;

Il y a beaucoup de clés étrangères sur d'autres tables comme tu as pu le remarquer.

les champs que je veux afficher sont:
acteur
profil
email
téléphone
application (seulement le nom de l'application)
code_application (on l'a 2 fois, donc je les afficherais dans 2 tableaux différents car ils ne concernent pas la même chose)
version_application  (idem)
CPI (je fais une requête avec le "id_acteur_cpi" qui me retourne le CPI correspondant!!)
debut_demande
fin_demande
etat_demande, etat_protocole
date_protocole
etat_demande
date_demande
nature
date_debut (absences)
date_fin
TM
version_TM
etat_TM
etat_pack
etat_qualif
acteur_pack (que j'ai grâce à "id_acteur_pack)
acteur_qualif (avec "id_acteur_qualif")


Mais vu que le tableau contient beaucoup de champs, je me suis dit qu'il serait mieux, pour plus de lisibilité, d'afficher les informations dans différents tableaux, surtout que dans les tables "demande" et "activite" on a certains champs identiques portant sur 2 choses différentes.
Donc voilà comment je l'ai finalement fait:
tableau 1: les champs de "personne" et "absences"
tableau 2: les champs de "activite"
tableau 3: ceux de "demande"

J'arrive à les afficher, et ça marche; mais crois-tu que ça soit une bonne idée???


je te remercie pour tes réponses

Dernière modification par honey0 (20-07-2010 10:32:24)

Hors ligne

#12 21-07-2010 08:59:29

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : sélection sur plusieurs tables mysql

Bonjour et merci,

Je regarde tout ca et je reviens vers toi dans la journée, je dois m'absenter cette fin de matinée.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#13 21-07-2010 10:58:41

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

ok !

Hors ligne

#14 21-07-2010 13:47:19

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : sélection sur plusieurs tables mysql

Bonjour,

Me revoila smile

Donc à propos de ton soucis, il y a plein de choses à dire, tu t'en doutes.

1) STRUCTURE DE TES TABLES

a) Concernant les tables abscences, activites et demande
l'id de chaque table n'est pas associée à l'id d'une personne. Du coup il est possible d'enregistrer des enregistrements orphelins pour chaque table. Il me paraît donc nécessaire pour chacune de ces table de définir une clé primaire à la fois sur leur id respective et sur l'id d'une personne. Tu peux aussi pour te faciliter la gestion de tes enregistrements, définir l'id de chaque table en auto_incrément. Ces tables étant censées être des tables de jonction, il te faudra donc pour tes jointures externes, définir obligatoirement un index à doublons sur le champ id personne de ta clé primaire.
Note secondaire: Pense dans la mesure du possible pour optimiser les performances de tes tables ainsi que pour la récupération de données en cas de crash DD, de définir des tables statiques autant que possible, et si ce n'est pas possible, essayer de limiter au maximum les champs de taille variable au sein de tes tables. Par ex, un numéro de tel n'a pas besoin d'un champ de type  VARCHAR, mettre un id au format numérique et si il est alphanumérique définir un peigne de codification sur une taille fixe ex : id="ABS" ou id="RJCT" et donc défini en type CHAR, quitte à faire une table qui liste les codes et les commente (2 champs), ce qui t'offrira de plus, beaucoup plus de souplesse dans la gestion de ton applicatif.
PS: Même un champ Password peut être défini en CHAR: Pour assurer à la fois la confidentialité des passwords utilisateur et la sécurité applicative, l'idéal est de définir un password en CHAR(40) et de l'encoder en SHA1 qui code en longueur fixe à 40 caractères.

b) La table Absences.
Il te faut un index sur datedebut et datefin. Je te conseille niveau performances de definir datedébut en timestamp avec en valeur par défaut current_timestamp. Du coup l'info datedebut sera automatiquement insérée à la création d'un enregistrement.

c) La table activite
Je ne suis pas certain en l'etat actuel des infos en ma possession que les indexs défini sur cette table soient necessaires dans leur ensemble.

2) CREATION DES VUES
Ton choix d'afficher les informations sur les trois tableaux cités dans ton dernier post me paraît le plus performant et le plus rationnel dans le cadre d'un applicatif de gestion de ces informations.
Par contre, dans l'etat actuel des choses, il te manque ta requête principale pour établir ton tableau de bord sur les personnes.
Une fois les modifications structurelles necessaires effectuées (celles du a)), il te sera possible de la réaliser. Voici les informations que je te propose d'y mettre:
1) Nom, prénom de la personne
2) actuellement en absence ou non
3) nombre d'absences par période de temps à définir (par ex: l'année en cours)
4) Nombre de demandes faites (sur l'année en cours par ex)
5) Nombre de demandes en cours de traitement
6) Nombre de Projets de travail en cours
7) Nombre de Projets de travail auquel la personne à participer sur l'année en cours par ex.

Si tu as besoin d'autres informations n'hésite pas à demander wink

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#15 21-07-2010 14:46:42

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

Salut,

1)
a) tables absences, activite et demande
les id de "activite" et de "demande" sont en auto_increment. Pour ce qui est de rentrer de mettre une clé primaire sur l'id de la table et de la personne, je ne l'ai pas fait parce que, d'après les modèles de tableaux déjà existants, il est possible de rentrer une activité ou une demande sans préciser la personne, donc cette colonne id_acteur_*** peut-être nulle.
J'ai exporté les tables et j'ai viré certains trucs que je croyais inutiles. on a par exemple:

 `id_acteur_pack` int(11) DEFAULT NULL,
  `id_acteur_qualif` int(11) DEFAULT NULL,

(mais je ne demande si ce n'est pas contre sens car ça pointe sur une autre table dans laquelle le champ ne peut être nul).

b)pour la table absence, j'avais pensé mettre comme clé (id, date_debut, date_fin), comme cela, on est sûr d'avoir enregistré une seule fois l'absence d'une personne pour une même date. Et pendant la saisie, qui se fait à travers une interface php, je vérifie, lorsqu'on rentre une nouvelle absence, si les dates rentrées ne chevauchent pas celles déjà présentes dans la base.

Quand au reste, merci des recommandations, je m'y attèle de suite!!!! big_smile

PS: si tu connais un site où on explicite certaines subtilités sur les tables et les requêtes (principalement les jointures) je suis preneur.

à +

Dernière modification par honey0 (21-07-2010 14:51:53)

Hors ligne

#16 21-07-2010 16:16:23

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : sélection sur plusieurs tables mysql

Bonjour,

En ce qui concerne la table absence, je n'ai pas vu de champ id personne^^. Vu qu'une absence est toujours liée à une personne, je pense que tu pourras appliquer la clé primaire aux deux champs id sur cette table.
Sur ce point sur les tables activite et demande, le fait que id_acteur peut être nulle, n'est pas trop rationel, car elle est toujours initiée par quelqu'un^^ même si c'est un adm ou autre. C'est important que tu le fasses à mon humble avis, quitte à rajouter une table qui codifie les personnes avec un champ supplémentaire indexé dans la table personne correspondant au type de personne ex:ADM (administrateur), ELE (Eleve)... etc. De cette manière tu as un tri supplémentaire sur ta base de données personne, et ca te permet de gérer tes tables de jonction comme il se doit.

Note concernant les données statiques: Dans le cas de figure ou cela ne pose pas de problème il peut être préférable de scinder une table en deux avec d'un coté les infos statiques et de l'autre les infos dynamiques. Mais il faut ne pas prendre à la légère ce genre d'optimisation et considérer l'ensemble de la base de données et l'applicatif par lui même avant ce type de mise en oeuvre.

Dernière modification par Jc (21-07-2010 16:20:08)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#17 22-07-2010 08:48:00

honey0
Membre
Inscription : 15-07-2010
Messages : 25

Re : sélection sur plusieurs tables mysql

je te remercie Jc pour toute ton aide, je vais suivre tes conseils

Hors ligne

Pied de page des forums