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

Langage SQL Discussion :

Problème de requête avec recherche multiple sur un même champ d'une table


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut Problème de requête avec recherche multiple sur un même champ d'une table
    Bonsoir,

    Je vous expose mon problème :

    Je développe un petit programme qui est chargé de référencer des fichiers par différents tags. Un fichier pouvant être décrit par plusieurs tags et un tag associé à plusieurs fichiers.

    Je dispose de 3 tables : tb_tag, tb_tag_fichier et tb_fichiers.

    tb_tag est composée de 2 champs idTag et nom. Elle sert à stocker les différents tags et à leurs associer un identifiant.

    tb_fichiers comporte plusieurs champs dont idFichier et chemin et sert à stocker la liste de tout les fichiers référencés par mon programme en leurs associant un idFichier unique.

    tb_tag_fichier se composede 2 champs idTag et idFichier et permet de faire le lien entre les tags et les fichiers.


    Je souhaite pouvoir rechercher la liste de tout les fichiers qui comportent :
    - au moins un tag dans une liste saisie par l'utilisateur
    - tout les tags saisies par l'utilisateur

    Cela fonctionne pour le premier cas, mais je butte sur le second.

    Je pense ma question "simple" pour un spécialiste SQL que je ne suis pas.

    L'un de vous serait il en mesure de m'aiguiller sur le chemin qui mène à la solution ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Bonjour,
    Je propose de faire une requête:
    avec une simple jointure entre les 3 tables
    qui renvoie uniquement l'Id du fichier et le nombre de ligne
    le tout groupé par id fichier
    avec un critère sur la liste des Id recherché

    Ainsi pour la première demande:
    Le nombre de ligne est supérieur à 1
    Pour la deuxième
    Le nombre de ligne correspond au nombre de tag recherché

    Il ne reste pluq qu'à écrire la requête...

    Tatayo.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    Voici ce que j'ai essayé jusqu'à présent, mais qui ne me donne pas le résultat souhaité :

    Cas 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select f.idFichier, f.nom, f.chemin  from tb_fichiers f 
    left outer join tb_tags_fichiers tf on f.idFichier = tf.idFichier 
    left outer join tb_tag t on t.idTag = tf.idTag where t.nom in ("..","...")
    Cas 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from tb_fichiers where idFichier in (select distinct idFichier from tb_tags_fichiers where 1=1 and idTag in ( select idTag from tb_tag where nom in ("..","...")

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 878
    Points
    12 878
    Par défaut
    Je pense que tu devrais jeter un oeil sur les tutoriels présents sur ce site, concernant le regroupement des lignes (GROUP BY), le comptage (COUNT)...

    Tatayo.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Je pense que tu devrais jeter un oeil sur les tutoriels présents sur ce site, concernant le regroupement des lignes (GROUP BY), le comptage (COUNT)...

    Tatayo.
    Euh, j'avoue que je ne comprend pas trop en quoi des COUNT et GROUP BY pourraient m'aider dans ce cas. Je souhaite retrouver une liste de fichiers correspondants à une liste de tags saisies, pas à en compter le nombre.

    A moins que ton idée ne soit que je compte par idFichier le nombre de correspondances avec la liste des tags saisie et que je compare ensuite avec ce nombre total pour connaitre la liste des fichiers qui corresponde?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    En fait, en partant de ce que j'ai compris de ton idée, j'ai la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select idFichier, COUNT(*) from tb_tags_fichiers 
    WHERE idTag in 
    (
    select idTag from tb_tag where nom in ("tag1","tag2")
    )
    GROUP BY idFichier
    qui me retourne un résultat tel que :
    idFichier - COUNT(*)
    1-2
    2-1
    3-1
    4-1
    5-2
    6-1

    Du coup, si je veut les fichiers qui correspondent à tout les tags, je prend ceux qui ont un résultat COUNT(*) à 2.
    Pour ceux qui correspondent à au moins un tag, je prend ceux qui ont un résultat à 1.

    CQFD. Par rapport à ce que je souhaitait faire au départ, il faut que je fasse un traitement au résultat avant de l'afficher, mais ca à l'air de bien marcher.

    Merci beaucoup tatayo !

  7. #7
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ta sous-requête est inutile. Il faut faire une jointure.

    - au moins un tag dans une liste saisie par l'utilisateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tf.idFicher
    FROM tb_tags_fichiers tf
    INNER JOIN tb_tag t ON t.idTag = tf.idTag
    WHERE t.nom IN ('tag1', 'tag2')
    - tous les tags saisies par l'utilisateur
    Il faut les compter par fichier et ne retenir que les fichiers dont le nombre de tags correspond au nombre de tags cherchés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT tf.idFicher
    FROM tb_tags_fichiers tf
    INNER JOIN tb_tag t ON t.idTag = tf.idTag
    WHERE t.nom IN ('tag1', 'tag2') -- 2 tags dans le IN
    GROUP BY tf.idFicher
    HAVING COUNT(*) = 2 -- fichiers avec 2 tags retenus
    Au passage, tu remarqueras que les valeurs textuelles s'écrivent en principe entre apostrophes et pas entre guillemets.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    Merci beaucoup CinePhil, c'est "encore mieux" que la solution précédente.
    Merci à vous 2 pour votre aide.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/03/2012, 17h02
  2. une requête avec 2 count sur la même table
    Par epeichette dans le forum Requêtes
    Réponses: 11
    Dernier message: 30/06/2009, 09h19
  3. Requête avec conditions multiples sur le même champ
    Par skerdreux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/06/2008, 19h15
  4. Requête avec plusieurs paramètres d'un même champ d'une table
    Par jb.julien dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/08/2007, 09h43
  5. [Access] Requête (avec AND) sur 1 meme champ d'une table
    Par jeje22 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/09/2006, 22h59

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