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 plueieurs tables


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 19
    Points
    19
    Par défaut requête sur plueieurs tables
    Bonjour !

    Voilà une journée que je m'arrache les cheveux, je crois que je n'ai pas bien compris le principe des jointures, sur ce coup-là.
    Si quelqu'un avait la gentillesse de m'aider ?

    J'apprends, je suis novice en MySQL... Clémence je vous en prie !

    Voilà mon problème.

    Je souhaite afficher une série d'articles et les informations s'y rapportant. Les informations qui concernent ces articles sont réparties sur plusieurs tables.

    Je veux afficher titre, contenu, nom auteur, prenom auteur, date, thème, catégorie.

    Les champs titre, contenu et date sont sur la table news, laquelle a aussi un id_auteur, et un id_news bien entendu.

    Dans une table membre, j'ai le nom et prenom de l'auteur.
    Dans une table news_cat , j'ai l'id_news ainsi que l'id_cat, car dans categorie, j'ai l'id_cat et le nom_categorie ...
    Même principe pour theme :
    table theme : id_theme, nom_theme
    table news_theme : id_news, id_theme

    Je suis pas si je suis très claire.

    Très sagement, j'ai écrit cette requête là :
    SELECT
    news.id_news,
    news_cat.id_categorie,
    news_theme.id_theme,
    news.titre,
    news.contenu,
    news.id_auteur,
    membre.nom,
    membre.prenom,
    news.date,
    categorie.nom_categorie ,
    theme.nom_theme
    FROM news, membre, categorie, news_cat, news_theme, theme
    WHERE membre.id_membre = news.id_auteur
    && categorie.id_categorie = news_cat.id_categorie
    && theme.id_theme = news_theme.id_theme
    ORDER BY id_news DESC limit 10

    qui BIEN ENTENDU me renvoie 10 résultats identiques...
    Si je mettais pas de limite elle m'en renverrait à l'infini...

    Mais je n'arrive pas à comprendre quelle technique je dois employer pour la jointure...
    LEFT JOIN ?
    un autre SELECT imbriqué ???
    Une meilleure clause dans WHERE ???

    J'ai lu des pages et des pages... Et là, j'ai la cervelle en surchauffe... Je répète : je débute... :s
    Est-ce qu'une bonne âme pourrait m'aiguiller vers la solution siouplaît ?

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Déjà pour commencer, je sais que c'est ce qui est enseigné dans les écoles, mais je te conseille de bannir définitivement de tes méthodes, les jointures dites implicites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FROM news, membre, categorie, news_cat, news_theme, theme
    WHERE membre.id_membre = news.id_auteur
    && categorie.id_categorie = news_cat.id_categorie
    && theme.id_theme = news_theme.id_theme
    C'est une source de bugs bien cachés et souvent pas évident à trouver.

    Une jointure devrait s'écrire toujours explicitement. Une jointure implicite se remplace par une jointure interne (INNER JOIN) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FROM news 
    INNER JOIN membre ON news.id_auteur=membre.id_auteur
    INNER JOIN news_cat ON ???? --> problème, lien non défini avec news
    INNER JOIN categorie ON categorie.id_categorie = news_cat.id_categorie
    INNER JOIN news_theme ON ??? --> problème, lien non défini avec news
    INNER JOIN theme ON theme.id_theme = news_theme.id_theme
    Le Where sert à filtrer les resultats obtenu et ne devrait pas servir à faire les jointures. C'est une érésie.

    Je ne sais pas pour MySQL, mais j'imagine que c'est comme les autres SGBD, le "Et" s'écrit AND et non pas &&
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    d'habitude, je mets effectivement AND, mais && passe aussi sur mysql en tout cas mais je vais suivre les deux conseils. (j'suis autodidacte, j'ai de mauvaises habitudes que je ne demande qu'à corriger merci !)
    Et je sens que là, j'ai de sacrées lacunes en mysql... :s

    Effectivement, ce qui est délicat, c'est que la table categorie et theme ont des id_categorie et id_theme qui sont non pas dans news, mais dans une table de lien à chaque fois : news_cat et theme_cat.

    Je me rends bien compte que ma requête ne marche pas et je vois que c'est stupide ce que je fais...
    Mais je ne sais tout bonnement pas comment faire pour relier toutes les tables en une requête,
    je sais pas si c'est possible en fait... J'imagine que oui ?!

    J'ai déjà vu qu'on pouvait inclure des select dans un select, mais là, je ne vois pas non plus si c'est vers cette solution que je dois me tourner.

    Je vais essayer en repartant de la proposition faite dans un premier temps, merci pour les conseils !!

    thooooo je pense que j'aurais dû mettre ça chez les nioubs débutants !! J'suis désoléééééée :s

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Dans la correction que je t'ai donné, il te manque le lien entre news_cat et news et entre news_theme et news.

    Si tu as compris les modifications que j'ai faites, tu devrais pouvoir retrouver ces liens manquant.

    Dans news_cat, par exemple, tu dois avoir un id_news et un id_categorie. Le id_catégorie est branché à la table categorie dans la jointure. Il te reste à relier à la table news par le id_news (si c'est bien lui).

    Si, après ça, ça marche pas explique plus en détail ton problème
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Oui, je vais essayer de trouver à partir de là,

    et je reviens signaler si j'y arrive pas, ou si j'ai enfin trouvé...
    Dans tous les cas, ton aide m'est déjà très précieuse, merci infiniment.
    (et oui, c'est exactement comme ça que le lien est fait.)

    -> va tester quelques idées de suite...

    edit : Ca marche !! Merci beaucoup beaucoup beaucoup, j'ai compris !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SELECT news.titre, 
    news.contenu,
    news.date,
    membre.nom,
    membre.prenom,
    membre.autorisation,
    categorie.nom_categorie,
    theme.nom_theme FROM news
     
    INNER JOIN membre ON news.id_auteur=membre.id_membre
     
    INNER JOIN categorie ON (SELECT id_categorie
    FROM news_cat
    WHERE news_cat.id_news = news.id_news)=id_categorie 
     
    INNER JOIN theme ON (SELECT id_theme
    FROM news_theme
    WHERE news_theme.id_news = news.id_news)=id_theme
    ;
    enfin cette fois-ci j'espère que la syntaxe n'est pas trop crado ?! :s

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

Discussions similaires

  1. Besoin d'aide pour requête sur grosse table
    Par Fabouney dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2006, 09h01
  2. Problème de requêtes sur deux tables
    Par Pymm dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 09h06
  3. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25
  4. Requête sur 2 tables ?
    Par kibodio dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2005, 15h57
  5. Requête sur 2 tables et surtout novice...
    Par kibodio dans le forum Langage SQL
    Réponses: 13
    Dernier message: 03/03/2005, 15h45

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