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 :

SELECT si présent une seule fois


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier Avatar de zamanika
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 106
    Points : 102
    Points
    102
    Par défaut SELECT si présent une seule fois
    Bonjour,

    En fait je pense que mon problème est hyper simple, mais n'étant pas un gourou des bases de données, je me casse les dents dessus depuis le debut de l'aprem...


    J'ai la table suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    id_article id_mot
     1   1  
     1   2
     2   1
     2   3
     2   4
     3   2
     3   5
     3   6

    Je voudrais selectionner dans cette table les id_mot correspondant à l'article 3 et qui ne sont pas présent dans d'autres articles. Donc en fait dans mon exemple ne selectionner que id_mot=5 et id_mot=6, MAIS pas id_mot=2 (qui est aussi dans l'article 1).

    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT id_mot FROM matable WHERE id_article=3 AND « id_mot qui n'est pas présent ailleurs dans la table ».
    En fait j'arrive à mes fins avec des boucles (en php), mais je fais autant de requete qu'il y a de mots, ce qui en situation réelle pose quelques problèmes de perfomance

    Donc si quelqu'un-e avait une idée...

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select id_mot
    FROM ta_table
    GROUP BY id_mot
    HAVING COUNT(*) = 1
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre régulier Avatar de zamanika
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 106
    Points : 102
    Points
    102
    Par défaut
    Salut Antoun !

    Merci pour ta réponse, mais malheureusement ça ne donne pas le résultat escompté.

    Si je fais ce que tu me dis, ça me renvoit tous les id_mot qui ne sont qu'une fois dans la table. Donc dans mon exemple : id_mot= 3,4,5 et 6.

    En fait, ce que je veux c'est ceux qui n'y sont qu'une fois, mais dans le "sous ensemble" de ceux qui appartiennent à id_article 3. Pour id_article=3, j'ai trois mots :2,5 et 6. Mais, parmi ces trois mots je ne veux que ceux qui ne correspondent pas à un autre article, donc 5 et 6, et pas 2 qui est aussi dans l'article 1.

    En fait , j'avais essayé un truc un peu comme tu proposes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id_mot FROM table WHERE id_article=3 GROUP BY id_mot HAVING COUNT(id_mot)=1
    Mais évidemment ça ne marche pas puisque mon "WHERE id_article=3" limite le SELECT aux trois mots de l'article 3 et "empeche" que ça regarde le reste de la table...

    Ps : désolé pour l'oubli de la balise code dans mon premier message

  4. #4
    Membre régulier Avatar de zamanika
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 106
    Points : 102
    Points
    102
    Par défaut
    J'ai résolu mon problème. C'est sans doute pas optimal comme solution (donc j'attends quelque temps avant de mettre 'résolu').


    Alors voilà ce que je fais :

    1/ selection des id_mot qui appartiennent à mon id_article :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id_mot FROM matable  WHERE id_article=3
    => me renvoit 2,5,6

    2/a partir de cette liste je construis une nouvelle requête (en php) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id_mot FROM matable WHERE id_mot=2 OR id_mot=5 OR id_mot=6 GROUP BY id_mot HAVING COUNT(id_mot)=1
    => me renvoit 5 et 6

    Donc j'ai en deux requêtes ce que je faisais avant en 500 dans mes boucles

    Celà dit, je m'interroge sur la taille que peut prendre ma clause "WHERE" : là je fais l'expérience sur 3 mots, mais un véritable article a plusieurs centaines de mots... Quelle limite y a t-il à une clause WHERE ?
    En bref est-ce que je peux me permettre de construire une clause WHERE de plusieurs dizaines (centaines ?) de lignes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE id_mot=2 OR id_mot=2 OR id_mot=7 OR id_mot=99 OR id_mot=12 OR id_mot=1287 OR id_mot=4558 OR id_mot=656 OR id_mot=11 OR id_mot=11 OR etc.
    En tout cas, bon WE !

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    si je résume, tu veux pour chaque article la liste des mots propres à cet article ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT id_article, id_mot
    FROM ta_table AS t1
    WHERE NOT EXISTS (
      SELECT 1
      FROM  ta_table AS t2
      WHERE t2.id_mot = t1.id_mot 
        AND t2.id_article <> t1.id_article
    )
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Membre régulier Avatar de zamanika
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 106
    Points : 102
    Points
    102
    Par défaut
    si je résume, tu veux pour chaque article la liste des mots propres à cet article ?
    Bonne synthèse de mon blabla ci-dessus

    Je n'ai pas le temps de tester ton code, mais je me penche dessus dés que possible et je reviens mettre un résolu si ça marche

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Autre version, dont la lecture est moins directe mais qui sera sans doute + rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t1.id_article, t1.id_mot
    FROM ta_table AS t1
      INNER JOIN ta_table AS t2 ON t2.id_mot = t1.id_mot
    GROUP BY t1.id_article, t1.id_mot
    HAVING COUNT(t2.id_article) = 1
    Sinon, quand tu voudras transformer ta série d'ID en une liste de mots, regarde la fonction GROUP_CONCAT http://dev.mysql.com/doc/refman/5.0/...functions.html.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  8. #8
    Membre régulier Avatar de zamanika
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 106
    Points : 102
    Points
    102
    Par défaut
    Merci, impec

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/12/2012, 15h32
  2. [MySQL] requête select une seule fois
    Par speedylol dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/02/2009, 06h40
  3. update et select en une seule fois
    Par laloupiote dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/06/2007, 15h58
  4. [VBA-E] selection en une seule fois
    Par SpaceFrog dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/10/2006, 16h37
  5. Réponses: 2
    Dernier message: 30/11/2004, 11h48

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