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 :

requete de type intersection avec minus sur tables many-to-many


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut requete de type intersection avec minus sur tables many-to-many
    Considérons 3 tables users, users_x_objets et objets dans une relation many-to-many.
    La table users défini les utilisateurs (PRIMARY user_id)
    La table objets défini différents objets (PRIMARY objet_id UNIQUE objet_nom)
    La table users_x_objets permet d'établir un rapport de possession entre les objets et les utilisateurs (PRIMARY user_id, objet_id)

    J'essaye d'établir une requete ou je voudrais sélectionner les utilisateurs qui ont un chapeau et des gants mais pas de valise, pour le moment j'arrive à ça mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT u.* FROM users u
    INNER JOIN users_x_objets x ON u.user_id=x.user_id
    INNER JOIN objets o ON x.objet_id=o.objet_id
    INNER JOIN objets m ON x.objet_id=m.objet_id
    WHERE o.objet_nom IN ('chapeau', 'gants') AND m.objet_nom NOT IN ('valise') 
    GROUP BY u.user_id
    HAVING COUNT(u.user_id)=2
    Si vous pouvez m'éclairer sur ce qui ne colle pas
    Merci

  2. #2
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT u.* FROM users u
         JOIN objets o, users_x_objets xo ON u.user_id=xo.user_id AND xo.objet_id=o.objet_id AND o.objet_nom='chapeau'
         JOIN objets m, users_x_objets xm ON u.user_id=xm.user_id AND xm.objet_id=m.objet_id AND m.objet_nom='gants'
    LEFT JOIN objets n, users_x_objets xn ON u.user_id=xn.user_id AND xn.objet_id=n.objet_id AND n.objet_nom='valise'
    WHERE n.objet_id IS NULL
    GROUP BY u.user_id
    Je prie pour ne pas avoir fait de faute de frappe.
    'EXISTS' et 'NOT EXISTS' pourraient donner une requète plus lisible.

    Sinon je viens de me dire qu'on pourrait essayer :
    SELECT u.* FROM users u
    INNER JOIN users_x_objets x ON u.user_id=x.user_id
    INNER JOIN objets o ON x.objet_id=o.objet_id
    GROUP BY u.user_id
    HAVING SUM(o.objet_nom='chapeau')>0 AND SUM(o.objet_nom='gants')>0 AND SUM(o.objet_nom='valise')=0

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Pas de faute de frappe hormis les parenthèses nécessaires pour MySQL 5 dans la première requête, les 2 fonctionnent très bien, merci Sivrît.
    La 1ère semble sensiblement plus rapide que la 2ème, mais je n'ai pas fait le test sur de très longs tableaux, par contre son écriture est plus fastidueuse surtout si on change le nombre d'objets à exclure ou inclure dans la recherche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.* FROM users u
         JOIN (objets o, users_x_objets xo) ON u.user_id=xo.user_id AND xo.objet_id=o.objet_id AND o.objet_nom='chapeau'
         JOIN (objets m, users_x_objets xm) ON u.user_id=xm.user_id AND xm.objet_id=m.objet_id AND m.objet_nom='gants'
    LEFT JOIN (objets n, users_x_objets xn) ON u.user_id=xn.user_id AND xn.objet_id=n.objet_id AND n.objet_nom='valise'
    WHERE n.objet_id IS NULL
    GROUP BY u.user_id

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

Discussions similaires

  1. [AC-2007] requete avec critère sur table
    Par paulmor56 dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2014, 13h34
  2. Boucle while avec action sur table SQL
    Par kamikazbe dans le forum JDBC
    Réponses: 4
    Dernier message: 01/06/2007, 11h46
  3. Réponses: 3
    Dernier message: 08/11/2006, 23h04
  4. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  5. [FB1.5]Vue avec jointure sur tables ?
    Par Sitting Bull dans le forum SQL
    Réponses: 2
    Dernier message: 07/12/2004, 17h07

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