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 :

Système de tags un peu particulier


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut Système de tags un peu particulier
    Bonjour tout le monde,

    J'ai créé cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT articles.id 
    FROM articles 
    JOIN relation ON relation.article_id = articles.id 
    JOIN tags ON tags.id = relation.tag_id 
    WHERE tags.id IN ( 9 ) 
    GROUP BY articles.id 
    HAVING count(DISTINCT relation.tag_id) = 1
    Pour pouvoir obtenir les ID des articles qui comporte strictement les ID ou l'ID incluts dans le IN.

    Le probleme est que par exemple, quand je demande les articles associés au tag Bio ( ID 9 ) comme dans la requete ci dessus , j'obtient les articles associé au tag bio mais également les articles associé au tag bio et à d'autre tags ( vêtement, alimentation ... ) .

    Et dans le cas de cette requete j'aimerais obtenir que les articles associé au tag bio et rien d'autre.

    Voila, j'espere être clair Si quelqun a une idée

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT articles.id 
        FROM articles 
             INNER JOIN relation
               ON relation.article_id = articles.id 
             INNER JOIN tags
               ON tags.id = relation.tag_id 
    GROUP BY articles.id 
      HAVING max(tags.id) = min(tags.id)
         AND min(tags.id) = 9;

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 805
    Points
    30 805
    Par défaut
    Si, comme je le suppose, la table Relation a pour clé primaire (Article_id, Tag_id), la requête pourrait s'écrire ainsi, te permettant d'avoir une liste de tag_id de plus d'un élément...
    Sinon il est inutile d'utiliser IN alors que = suffirait largement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  articles.id 
    FROM    articles 
    WHERE   EXISTS
            (   SELECT  1
                FROM    relation    AS r1
                WHERE   r1.article_id = articles.id  
                    AND r1.tag_id   IN (9)   
            ) 
        AND NOT EXISTS
            (   SELECT  1
                FROM    relation    AS r2
                WHERE   r2.article_id = articles.id  
                    AND r2.tag_id   NOT IN (9)   
            )
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    Merci de votre aide

    @al1_24 ta solution ne marche que partiellement, selont le nombre de tags, ça ne marche plus

    @Waldar ta solution marche très bien, mais pour seulement un tag ...

    Je pense qu'il est assez difficile d'obtenir strictement les même tags, et surtout que c'est assez lourd au final ... peutêtre serait il plus simple de lister les tags directement dans la table articles et de comparer ensuite vu que les tags ne change jamais ?

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 805
    Points
    30 805
    Par défaut
    Citation Envoyé par Overstone Voir le message
    @al1_24 ta solution ne marche que partiellement, selont le nombre de tags, ça ne marche plus
    Dans quels cas ne fonctionne-t-elle pas ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Voici une solution avec les tags 9 et 10 et les opérateurs ensemblistes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ( select article FROM relation where tag=9
     INTERSECT
     select article FROM relation where tag=10 )
    EXCEPT
     select article FROM relation where tag not in (9,10)

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 805
    Points
    30 805
    Par défaut
    En effet, j'avais oublié un niveau de test
    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
    SELECT  articles.id
    FROM    articles
    WHERE   EXISTS
            (   SELECT  1
                FROM    relation    AS r1
                WHERE   r1.article_id = articles.id  
                    AND r1.tag_id   IN (liste_de_valeurs)
                HAVING  COUNT(DISTINCT r1.tag_id) = nombre_de_valeurs  
            )
        AND NOT EXISTS
            (   SELECT  1
                FROM    relation    AS r2
                WHERE   r2.article_id = articles.id  
                    AND r2.tag_id   NOT IN (liste_de_valeurs)  
            ) 
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    Merci beaucoup pour votre aide

    Ça marche parfaitement ! Le pire c'est que j'ai essayé avant avec
    HAVING COUNT mais j'ai du me tromper quelques part

    J'espere que cette requete n'est pas trop gourmande car elle sera souvent utilisé ( à chaque recherche ) ...

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

Discussions similaires

  1. Système d'équation de matrices un peu particulier
    Par CarolinePeroni dans le forum Mathématiques
    Réponses: 3
    Dernier message: 18/01/2010, 15h35
  2. Menu un peu particulier avec des onmouseover
    Par Jinroh77 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/02/2006, 14h30
  3. #define un peu particulier
    Par greuh dans le forum C
    Réponses: 14
    Dernier message: 12/10/2005, 16h42
  4. Réponses: 2
    Dernier message: 05/01/2004, 11h23

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