IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requéte sur plusieurs tables


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 34
    Points
    34
    Par défaut Requéte sur plusieurs tables
    Bonjour,

    J' ai un problème lors d'une requête sur plusieurs tables un peu spéciale, Voila l'exemple vaut mieux qu'un long discourt, j'ai deux tables du style :

    Table Societe
    -->id
    -->nom
    -->Activite1 (id associé à la table activite)
    -->Activite2 (id associé à la table activite)

    Table Activite
    -->id_activ
    -->nom_activ

    Dans le cas d'une sélection classique, si il y'avait 1 seule activité par société, il faudrait sqimplement faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resultat = mysql_query("SELECT S.nom, A.nom_activ as activite FROM societe S,activite A WHERE A.id_activ=S.Activite1");
    Mais, dans mon cas, il y'a 2 activités possible pour chaque société, comment retourner le nom et les 2 activités associé lors d'une requête SELECT ?

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT S.nom, A1.nom_activ as activite1, A2.nom_activ as activite2
    FROM societe S
    INNER JOIN activite AS A1
       ON A1.id_activ=S.Activite1
    INNER JOIN activite AS A1
       ON A2.id_activ=S.Activite2
    Tu peux le faire avec des WHERE si tu préfères mais j'aime bien cette syntaxe.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Mais c'est parfait tout ca, ca marche nikel, par contre, j'aurais une autre petite question, on gardant l'exemple ci-dessus, si un enregistrement dans la société n'a qu'une et une seule activité (donc le 2nd champs activité est à ''), le requête SELECT ne va pas retourner cet enregistrement.
    Pourtant la condition n'est pas fausse ?!

    Merci beaucoup en tout cas

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Dans ce cas, c'est une jointure de type LEFT JOIN qu'il te faut !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    Le marteau piqueur pour enfoncer un clou !

    Ton modèle de données est à changer de toute urgence tout simplement. Il n'est pas bon du tout et n'utilise pas les principes relationnels de base!
    Tu vas être obligé de faire du SQL délirant et inperformant au possible pour passer des requetes qui dans un modele de données correct seraient élémentaires!!

    Il suffirait juste d'avoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SOCIETE                         ACTIVITE
    ID-------------                  ID_ACT
    NOM            |---------->   ID_SOC
                                    NOM_ACT
    Ta requete devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select s.nom, a.nom_act from societe s, activite a where s.id=a.id_soc;

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Excuse-moi gregory, mais t'es en train de dire une grosse connerie, là!

    Pourquoi tu veux mettre l'ID_SOC dans la table ACTIVITE? Ca n'a aucun sens! Ca reviendra à dire que pour une activité donnée il y a au plus une société. Heureusement qu'il y a un peu plus d'un boucher pour tout le territoire Français sinon je ne sais pas ce que je mangerais à midi!

    Si tu avais proposé une relation 1-n, j'aurais été un peu plus d'accord avec toi (et encore...). Mais ce que tu proposes, c'est complètement ridicule. (et c'est toi qui vient dire: "Ton modèle de données est à changer de toute urgence." )
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    l'id_societe n'est pas la clé primaire mais bien une clé étrangère sur la table societé! La clé primaire est id_act.

    Docn pour t'expliquer puisque ca semble pas évident à tout le monde..

    Ex :
    Societe
    Id_soc - Nom
    10 - AXA
    20 - TOTO SARL

    ACTIVITE
    Id_act - Id_soc - nom_act
    1 - 10 - Banque
    2 - 10 - Assurance
    3 -20 - Plomberie
    4 -20 - Peinture

    De sorte que AXA fait de la banque et des assurances
    et TOTO SARL fait de la plomberie et de la peinture !

    Je suis pas complètement abruti, ca fait quand meme plusieurs années que je bosse dans les bases de données, j'en ai vu des modèles de données!

    ET donc je le repete, le modele est à changer! Ces modifications seront bcp plus performantes que les requetes SQL à coucher dehors avec des inner join ou left join !

    Donc ce que je dis n'est pas ridicule!

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par gregory.broissard
    Docn pour t'expliquer puisque ca semble pas évident à tout le monde..
    J'avais parfaitement compris, je ne suis pas complètement bête non plus!

    En fait ce que tu veux faire, c'est:

    Societe
    Id_soc - Nom
    10 - Société Géniale
    20 - Crédit à Bricoles
    30 - PNB-Baripas
    ...

    ACTIVITE
    Id_act - Id_soc - nom_act
    1 -10 - Banque
    2 -20 - Banque
    3 -30 - Banque
    ...

    Si c'est pas redondant, dis-moi ce que c'est ! (des réminiscences de COBOL?)

    J'ai peut-être pas 20 ans d'expériences en entreprise mais j'ai jamais pris ça pour un gage de qualité.


    Citation Envoyé par gregory.broissard
    Ces modifications seront bcp plus performantes que les requetes SQL à coucher dehors avec des inner join ou left join !
    Et tu fais comment sans jointure avec ta solution?



    Maintenant, en suivant MERISE :

    SOCIETE
    Id_soc - Nom
    1 - Société Géniale
    2 - Crédit à Bricoles
    3 - PNB-Baripas
    ...


    activ_soc
    Id_act - Id_soc
    10 - 1
    20 - 1
    30 - 1


    ACTIVITE
    Id_act - nom_act
    1 - Banque

    On peut aussi vouloir classer les activités selon un ordre (primaire, secondaire...) en ajoutant un champ dans l'association "activ_soc".
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    ben en suivant Merise ca me parait bien ! . En tout cas beaucoup mieux que le modele de départ et plus flexible que ce que je proposais.

    D'ailleurs je fais remarquer que la redondance que tu considères comme n'étant pas un gage de qualité (vive le cobol ! ) se retrouve dans le modèle Merise sur la table activ_soc... Pour chaque entreprise, on aura un à n entrées dans la table activ_soc.

    Donc finalement je crois qu'on tombe d'accord sur la modification du modèle de données, ce que je disais au départ. Apres le choix d'utiliser la table intermédiaire dépend de l'utilité sur l'appli considérée!

  10. #10
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Ben alors tu vois qu'un petit jeune "sans expérience" peut faire au moins aussi bien qu'une personne ayant travaillé pendant x années en entreprise (franchement je commence à en avoir ras le *** qu'on me réponde que mon parcours ne correspond pas au poste proposé !)

    Citation Envoyé par gregory.broissard
    Pour chaque entreprise, on aura un à n entrées dans la table activ_soc.
    Oui, mais c'est pas redondant pour autant: on ne répète pas le mot "banque" à chaque fois. En plus on a une table ACTIVITE qui regroupe toutes les activités répertoriées et permet de faire une liste dans le formulaire de saisie.

    C'est vrai que le modèle de départ présentait quelques défauts:
    - limité à 2 activités: une principale et une secondaire

    Par contre, le nouveau modèle n'est pas parfait non plus: il oblige entre autres à faire pas mal de tests pour assurer l'intégrité du modèle:
    - vérifier qu'une entreprise ait au moins une activité
    - vérifier qu'une entreprise n'ait pas 2 fois la même activité (fait au niveau des clefs)
    - éventuellement gérer les activités principale/secondaire/etc.

    ***
    Sinon, j'ai bien cru qu'on allait finir par se tapper dessus...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Très bien messieurs, j'ai moi même cru que vous alliez aussi vous taper dessus, effectivement, le modèle de donnée auquel je pensais n'est pas parfait d'autant que j'avais mis 2 activités possible pour l'exemple, mais en réalité, cela pouvait en théorie monter jusqu'à 10 activités !!
    C'est pourquoi, je vais envisager plutôt d'utiliser le 2nd modèle (Merise) qui semble être mieux adapté dans ce cas précis.

    En tout cas, merci à vous tous pour votre aide précieuse.

    PS : au faite, pour info, effectivement avec un LEFT JOIN, ca marche comme il faut (cf ma dernière demande)

  12. #12
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par polux23
    Très bien messieurs, j'ai moi même cru que vous alliez aussi vous taper dessus
    Ben ça fait ça quand les grands esprits se rencontrent: ça fait mal ! Boum aïe!
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. faire une requête sur plusieurs tables
    Par julien.63 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/08/2006, 22h58
  2. suite au problème de requête sur plusieur table
    Par michelGProuq dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/07/2006, 16h19
  3. [VB6] RecordSet, Oracle, requête sur plusieurs Tables
    Par pier* dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/04/2006, 10h19
  4. Requête sur plusieurs tables
    Par sta_schmitt dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/03/2006, 13h54
  5. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo