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 et SQL. Discussion :

Recherche de plusieurs valeurs dans un seul champ d'une table de jonction


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut Recherche de plusieurs valeurs dans un seul champ d'une table de jonction
    Bonjour à tous.

    Au départ, ça me semblait hyper simple. Mais j'avais pas trop réfléchi...

    Alors voilà : j'ai une bdd ultra simple : les dessins animés de la Warner Bros.
    - une table T_film avec deux champs : "ID_film" et "titre" (800 enregistrements)
    - une table T_personnage avec deux champs : "ID_personnage" et "nom" (30 enregistrements)
    - une table de jonction TJ_personnage_dans_film avec trois champs : "ID_personnage_dans_film", "film_ID" et "personnage_ID" (1300 enregistrements)

    Vous l'aurez compris, un film peut avoir 0, 1 ou plusieurs personnages (ex un dessin animé avec Daffy Duck seul, un autre avec Daffy et Bugs Bunny, ou encore un film sans personnage connu) et, bien sûr, les personnages peuvent apparaître dans plusieurs films.

    Je veux faire un formulaire de recherche par personnages qui se présente ainsi : les personnages sont présentés avec une case à cocher chacun. Quand on coche un personnage, il affiche dans un sous formulaire tous les films où apparaît ce personnage (ça c'est facile, je sais faire). Mais, si on coche deux personnages, il affiche les films où apparaissent les deux personnages ensemble (ex, Daffy + Bugs Bunny), si on en coche un troisième, il restreint encore en affichant les films où joue le trio (ex : Daffy + Bugs + Elmer), etc. Si on ne coche rien, il affiche les films où n'apparaît aucun personnage connu.
    J'ai imaginé qu'il fallait passer par la table de jonction et faire une sélection du style "SELECT * FROM TJ_personnage_dans_film WHERE personnage_ID = x Or y Or z" (exemple avec trois personnages), puis chercher dans les résultats les films qui apparaissent 3 fois, en faire une nouvelle requête de type SELECT DISTINCT pour avoir la liste des films... mais ça ressemble un peu à une usine à gaz et en plus je me sens incapable de mettre ça en place... en bref je me demande s'il n'y aurait pas plus simple.

    Quelqu'un aurait-il une solution ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Salut,

    il te suffit de rediger le contenu du critere a la volee, avec IN

    ce code reste a adapter exactement a ton cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim strSQL  As String
    strSQL = "SELECT DISTINCT FILM FROM (TaTableFilm INNER JOIN TaTablePersonnageDansFilm) WHERE IDPersonnage IN ("
    For i=1 TO 800 'selon le nombre de checkbox perso
    if Me.Controls("TaCheckBox" & i).Value Then
    strSQL = strsql & i ","
    Next i
    strSQL = Left(strSQL,Len(strSQL)-1) & ")"
    TonSousFormulaire.RowSource= strSQL
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Ah oui, merci beaucoup, ça s'approche de près de ce que je veux. Si j'ai bien saisi, ce paramètre IN équivaut peu ou prou à OR, non ?

    Mais...

    lorsque je mets deux personnages, il me renvoie les films avec les deux personnages, certes, mais aussi les film avec seulement un des deux personnages. Or je voudrais qu'il ne me renvoie QUE les films où ces deux personnages sont ensemble (avec éventuellement d'autres larrons, ça je m'en fiche).

    Est-ce possible ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Ce n'est pas ce que j'avais compris, d'ou ma requete.

    Si tu veux avoir le bon nombre de films, il te faut passer en plus de ce que je t'ai donne par un


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim strSQL  As String
    Dim compteur as Integer
    strSQL = "SELECT DISTINCT FILM FROM (TaTableFilm INNER JOIN TaTablePersonnageDansFilm) WHERE IDPersonnage IN ("
    For i=1 TO 800 'selon le nombre de checkbox perso
    if Me.Controls("TaCheckBox" & i).Value Then
    compteur = compteur +1
    strSQL = strSQL & i ","
    Next i
    strSQL = Left(strSQL,Len(strSQL)-1) & ")"
    strSQL = strSQL & " GROUP BY Film"
    strSQL & strSQL & " HAVING Count(Personnage)=" & compteur
    TonSousFormulaire.RowSource= strSQL
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Génial ! C'est ça !
    Je suis décidément loin de maîtriser toutes les possibilités. Je ne connaissais pas les GROUP BY et HAVING...

    Juste un petit plus, maintenant : je voudrais que, si aucun personnage n'est coché, il n'affiche que les films qui n'ont pas de personnage connu... donc, j'imagine, les film qui n'apparaissent pas dans la table TJ_personnage_dans_film.

    Un grand merci.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Oui, mais a ce moment la il te faut faire une jointure externe + is null = requete de non correspondance.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM FILM LEFT JOIN PersonnageDansFilm ON FILM.IDFilm = PersonnageDansFilm.IDFilm
    WHERE PersonnageDansFilm.IDFilm IS NULL
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2017, 13h55
  2. [AC-2007] Création d'etat avec plusieurs valeurs dans un seul champ
    Par k.p-j dans le forum IHM
    Réponses: 3
    Dernier message: 02/05/2012, 16h07
  3. Mettre plusieurs valeurs dans un seul champ hidden asp
    Par gabdeschenes dans le forum ASP.NET
    Réponses: 3
    Dernier message: 28/10/2009, 18h52
  4. Mettre plusieurs fichiers dans un seul fichier ou une table…
    Par wahab2052 dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 21/09/2009, 20h41
  5. sélection multiple de valeurs dans un seul champ
    Par antoine0207 dans le forum Access
    Réponses: 4
    Dernier message: 04/07/2006, 17h01

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