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 :

Récupérer une liste via une table de liaison


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut Récupérer une liste via une table de liaison
    Bonjour,

    Tout d'abord voici le schéma de ma base, j'ai 3 trois tables, dont une fait office de table de liaison:

    table "article":

    idArticle
    title
    content

    table "categorie"

    idCatgorie
    name

    table article_categorie:

    fk_idArticle
    fk_idCategorie

    Cette table de liaison me permet d'assigner plusieurs catégories pour un article.

    Pour récupérer mes articles, je fais un simple SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idArticle, title, content FROM article...
    Cela me retourne la liste de mes articles, normal quoi.

    Mais maintenant, j'aimerais que ça me retourne la liste des articles, avec pour chaque article la liste des catégories assignées à cet article...

    Et là je ne sais pas comment faire...

    Une idée pour de l'aide?

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Documentez vous sur les jointures (internes dans votre cas), elles feront votre bonheur

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  3. #3
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Merci pour votre réponse, j'ai essayer cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM article a
    INNER JOIN article_categorie ac ON a.idArticle = ac.fk_idArticle
    INNER JOIN categorie c ON ac.fk_idCaegorie = c.idCategorie
    Si j'ai 1 article qui est lié avec 3 catégories, ça me retourne 3 lignes, ce qui est normal, si je veux une seule ligne je dois traiter ça avec un autre language (php dans mon cas).

    Du coup je me pose une nouvelle question: Est-ce qu'il est possible que ça me retourne 1 ligne par article, avec 1 champ en plus "listCategorie" qui contient un genre de CONCAT() sur les catégories de mon article courant?

    Merci

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    peut etre ici ?

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  5. #5
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Yeah! Merci, voici mon résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *, GROUP_CONCAT(c.name ORDER BY c.name SEPARATOR ', ') AS listeCat FROM article a
    INNER JOIN article_categorie ac ON a.idArticle = ac.fk_idArticle
    INNER JOIN categorie c ON ac.fk_idCaegorie = c.idCategorie
    Une autre question: Que je mette INNER JOIN OU LEFT JOIN, ça me donne le même résultat, donc quelle est la différence entre les deux? un est plus rapide que l'autre?

    PS: Il y a une erreur dans la FAQ, les deux derniers paramètres de la fonction GROUP_CONCAT() sont inversés.

    Merci pour l'aide.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    INNER JOIN ne donne que les lignes qui ont une correspondance dans les deux tables

    Exemple :
    Table A :
    id, txt
    1, 'toto'
    2, 'titi'
    3, 'tata'
    4, 'tutu'

    Table B :
    id, idA
    1, 2
    2, 3
    3, 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.id AS idA, A.txt, B.id AS idB
    FROM A
    INNER JOIN B ON A.id = B.idA
    ORDER BY A.id
    Résultat :
    idA, txt, idB
    1, 'toto', 3
    2, 'titi', 1
    3, 'tata', 2
    => 'tutu' n'a pas de correspondance dans la table B et n'est pas retourné par la requête.

    LEFT JOIN donne toutes lignes de la table de gauche et la correspondance de données quand il y en a dans la table de droite, NULL quand il n'y en a pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT B.id AS idB, A.txt
    FROM A
    LEFT JOIN B ON A.id = B.idA
    Résultat :
    idA, txt, idB
    1, 'toto', 3
    2, 'titi', 1
    3, 'tata', 2
    4, 'tutu', NULL
    => 'tutu' n'a pas de correspondance dans la table B mais est retourné par la requête avec NULL dans la colonne issue de B.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Merci pour vos informations

    Après avoir fait deux-trois test, un nouveau problème survient...si je prends ma requête et que je rajoute un WHERE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *, GROUP_CONCAT(c.name ORDER BY c.name SEPARATOR ', ') AS listeCat FROM article a
    INNER JOIN article_categorie ac ON a.idArticle = ac.fk_idArticle
    INNER JOIN categorie c ON ac.fk_idCaegorie = c.idCategorie
    WHERE c.idCategorie=1
    Mon GROUP_CONCAT me retourne que la catégorie courante, ce qui est normal à cause de mon WHERE...mais j'aimerais qu'il me renvoie toujours toutes les catégories de mon article même quand j'ai un WHERE...

    Est-ce possible toujours en une requête? ou une sous-requête?

    Merci

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par nesswaw Voir le message
    Mon GROUP_CONCAT me retourne que la catégorie courante, ce qui est normal à cause de mon WHERE...mais j'aimerais qu'il me renvoie toujours toutes les catégories de mon article même quand j'ai un WHERE...
    Euh... là il va falloir que tu nous expliques plus concrètement ton besoin car c'est ou bien pour une catégorie ou bien pour plusieurs !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    J'explique:

    J'ai une table qui contient des articles.
    J'ai une table qui contient une liste de catégories.
    J'ai une table de liaison, parce un article peut avoir plusieurs catégories.

    J'aimerais afficher une liste d'articles sous forme de liste tabulaire avec l'id de l'article, son titre, et les catégories de l'article:

    id article | titre article | catégories
    ---------- | ------------ | ------------
    1 | Titre 1 | Cat1, Cat2
    2 | Titre 2 | Cat1, Cat3
    3 | Titre 3 | Cat2

    Mais j'aimerais aussi afficher cette liste suivant divers filtres, comme par exemple afficher tous les articles de la "Cat2", ce qui me donnerait ce résultat :

    id article | titre article | catégories
    ---------- | ------------ | ------------
    1 | Titre 1 | Cat1, Cat2
    3 | Titre 3 | Cat2

    Vous voyez le truc?

    Merci

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Autrement dit, tu voudrais afficher tous les articles de la catégorie 2 et toutes les catégories de ces articles ?

    GROUP_CONCAT s'utilise avec GROUP BY !
    Évite la guerre des étoiles !

    Il te faut une autre jointure sur la table associative pour récupérer toutes les catégories des articles de la catégorie 2.

    1) Quelles sont les articles de la catégorie 2 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.idArticle
    FROM article a
    INNER JOIN article_categorie ac ON a.idArticle = ac.fk_idArticle
    WHERE ac.fk_idCategorie = 2
    2) Quelles sont toutes les catégories de ces articles ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.idArticle, a.titreArticle,
        GROUP_CONCAT(c.name ORDER BY c.name SEPARATOR ', ') AS listeCat 
    FROM article a
    INNER JOIN article_categorie ac ON a.idArticle = ac.fk_idArticle
        LEFT OUTER JOIN article_categorie ac1 ON ac1.fk_idArticle = ac.fk_idArticle
            LEFT OUTER JOIN categorie c ON ac1.fk_idCaegorie = c.idCategorie
    WHERE ac.fk_idCategorie = 2
    GROUP BY a.idArticle, a.titreArticle
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Autrement dit, tu voudrais afficher tous les articles de la catégorie 2 et toutes les catégories de ces articles ?
    Afficher tous les articles de la catégorie 2 et pour chaque article afficher les catégories qui lui sont assignées.

    Citation Envoyé par CinePhil Voir le message
    GROUP_CONCAT s'utilise avec GROUP BY !
    Évite la guerre des étoiles !
    ??

    Citation Envoyé par CinePhil Voir le message
    Il te faut une autre jointure sur la table associative pour récupérer toutes les catégories des articles de la catégorie 2.

    1) Quelles sont les articles de la catégorie 2 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.idArticle
    FROM article a
    INNER JOIN article_categorie ac ON a.idArticle = ac.fk_idArticle
    WHERE ac.fk_idCategorie = 2
    2) Quelles sont toutes les catégories de ces articles ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.idArticle, a.titreArticle,
        GROUP_CONCAT(c.name ORDER BY c.name SEPARATOR ', ') AS listeCat 
    FROM article a
    INNER JOIN article_categorie ac ON a.idArticle = ac.fk_idArticle
        LEFT OUTER JOIN article_categorie ac1 ON ac1.fk_idArticle = ac.fk_idArticle
            LEFT OUTER JOIN categorie c ON ac1.fk_idCaegorie = c.idCategorie
    WHERE ac.fk_idCategorie = 2
    GROUP BY a.idArticle, a.titreArticle
    Avec la 2ème requête ça a l'air de fonctionner, par contre si j'enlève le WHERE, il m'affiche les catégories en double pour chaque article, c'est normal ?


    Ça devient assez complexe, là. Je m'y perds un peu.

    Merci pour l'aide

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par CinéPhil
    GROUP_CONCAT s'utilise avec GROUP BY !
    Voir la doc MySQL !

    Citation Envoyé par CinéPhil
    Évite la guerre des étoiles !
    J'avais un lien vers un article qui explique qu'il ne faut pas utiliser SELECT * mais nommer les colonnes dont on a besoin dans le SELECT mais le lien est mort.

    Citation Envoyé par nesswaw
    Avec la 2ème requête ça a l'air de fonctionner, par contre si j'enlève le WHERE, il m'affiche les catégories en double pour chaque article, c'est normal ?
    J'avais essayé de te montrer la construction progressive de la requête mais apparemment tu n'as pas compris !

    La requête à utiliser est évidemment la seconde, la première n'étant qu'une étape intermédiaire et elle est incluse dans la seconde.
    À la première requête, j'ai ajouté une jointure vers la table associative pour récupérer toutes les catégories des articles de la catégorie 2.

    Si tu enlèves le WHERE, bien entendu, tu te retrouves avec tous les articles de toutes les catégories et comme il y a double jointure sur la table associative, tu as les résultats en double !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [SP-2010] récupérer les terme d'une colonne d'une liste dans une autre liste
    Par Noruk dans le forum SharePoint
    Réponses: 2
    Dernier message: 09/02/2015, 18h15
  2. Récupérer la valeur d'une liste dans une autre page
    Par olivier94 dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 11h20
  3. PHP Passer une variable via une liste deroulante
    Par lepierre dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2006, 12h09
  4. Réponses: 4
    Dernier message: 07/08/2006, 17h01
  5. Ajouter une ligne dans une liste via un POPUP
    Par seblo_scoqi dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/01/2005, 16h20

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