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 :

besoin d'aide pour une jointure avec une exclusion


Sujet :

Requêtes MySQL

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

    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 130
    Points
    130
    Par défaut besoin d'aide pour une jointure avec une exclusion
    Bonjour,

    J'ai besoin d'aide pour une requête qui me pose problème.

    J'explique le topo :
    Une base de données avec 3 tables (en fait beaucoup plus mais les autres ne nous intéressent pas) : table actu, table categorie et table categorie_actu.

    La table actu contient une liste d'actu (identifiant, titre, texte de l'actu, dates, etc... juste des infos à afficher).
    La table categorie contient une liste de catégories (identifant, libelle).
    La table categorie_actu fait le lien entre les 2 tables précédentes : id_actu et id_categorie. Notez qu'une actu peut appartenir à plusieurs catégories (sinon je n'aurais pas cette table et j'aurais mis un champ id_categorie directement dans ma table actu).

    Et justement c'est le cas ! Au début je n'avais que 2 catégories : actu et évènement. Et je devais faire une requête pour récupérer toutes mes actus d'une catégorie ou de l'autre.
    Ma requête était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *, actu.id_actu "id_actu" FROM actu
    INNER JOIN categorie_actu ON categorie_actu.id_actu = actu.id_actu AND categorie_actu.id_cat = '1'
    WHERE statut_actu = '1'
    ORDER BY tri_actu DESC, date_modif_actu DESC
    Mais j'ai changé un peu le programme. Je souhaite que certaines actus ne soient accessibles qu'à une partie privé. J'ai donc ajouter une catégorie : privé. Et lorsqu'une actu est considéré comme "privé", je l'ajoute à cette catégorie en plus de la catégorie à laquelle elle appartenait au départ.

    Donc maintenant, la requête ci-dessus me sers lorsque j'ai accès à la partie privé. Mais lorsque je n'y ai pas accès, je dois faire un test de plus pour exclure les actus associé à l'identifiant de ma catégorie privé (qui porte l'id_cat 3).

    Dans ce dernier cas, je pensais afficher mes résultats avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *, actu.id_actu "id_actu" FROM actu
    INNER JOIN categorie_actu ON (categorie_actu.id_actu = actu.id_actu AND categorie_actu.id_cat = '1' AND categorie_actu.id_actu != 3)
    WHERE statut_actu = '1'
    ORDER BY tri_actu DESC, date_modif_actu DESC
    Mais j'ai toujours la même liste (donc avec mes actus appartenant à l'id_cat 3) qui s'affiche.
    Quelle est la solution ? Et dans le but d'apprendre un peu quelle est l'erreur dans ma requête ?

    Merci pour votre aide.

  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
    Le problème est que les actus appartiennent à plusieurs catégories. Un JOIN fait un produit cartésien donc la requête liste une actu une fois par catégorie à laquelle elle appartient. 'categorie_actu.id_actu != 3' filte celle de la catégorie privée mais pas l'autre.

    Dans la série solutions en vrac, ne donner qu'une catégorie aux actus (genre "news" OU "news privées"), ou regarder du côté de la clause "NOT EXISTS", faire un "LEFT JOIN" sur categorie_actu (donc une deuxième jointure) qui recherche "categorie_actu.id_actu=3" et vérifier que c'est bien NULL (ce qui équivaut à "NOT EXISTS"). Ou encore un "GROUP BY actu.id_actu" et filtrer sur "SUM(categorie_actu.id_actu=3)=0".

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

    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 130
    Points
    130
    Par défaut
    Yop ! Merci pour cette réponse !
    Qu'une actu ne peut appartenir qu'à une seule catégorie ne m'arrange pas. Certaines actus peuvent réellement appartenir à plusieurs catégories (en plus de la catégorie privé). D'ailleurs j'avais simplifié le texte mais en fait il n'y a pas 3 catégories mais beaucoup plus.

    En fait, mon problème devevnait urgent à régler et du coup comme je n'avais pas encore de réponse à mon message ce matin (et que je n'avais pas trouvé de solutions de mon côté), j'ai mis en place une solution simple, mais par le code (PHP) plutôt que par la requête. Lorsque je parcours mes résultats à la suite de la requête de base (celle d'origine qui n'a pas été modifié), je refais un test (une requête) sur chaque actu pour voir si elle appartient à la catégorie privé. Si c'est le cas, je ne l'affiche pas.

    J'aurais préféré une solution sur la requête de base car là du coup je refais autant de requête que j'ai d'actus. Mais bon, ce n'est pas dramatique. Ma requête de vérif est très légère et je n'ai pas un grand nombre d'actus non plus.

    Je n'ai malheureusement pas le temps de tester tes pistes tout de suite mais j'essaierai de m'y pencher tout de même.

    Merci encore.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Faire une requete avec une jointure ramenant une base SQL et un ebase Oracle
    Par Clement M dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 22/12/2014, 14h13
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Réponses: 4
    Dernier message: 15/10/2009, 13h33

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