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 :

Trouver des enregistrements d'une table qui ne sont pas encore dans une autre table (NOT IN)


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2019
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Trouver des enregistrements d'une table qui ne sont pas encore dans une autre table (NOT IN)
    Bonjour,

    Je suis en-train de créer un gestionnaire de bibliothèque d'images avec un système de publication d'articles, un peu comme le WordPress...

    J'ai les tables suivantes :
    images(id_image, nom_image, format)
    article(id_article)
    article_image(idai, fk_id_article, fk_id_image)

    Je souhaite que si l'internaute supprime un article on vérifie si l'image utilisée par cet article est encore utilisée par un autre article, si elle n'est plus utilisée par aucun article alors on recupere son nom et format pour la supprimer sur le serveur (puis après de la BDD accessoirement...).
    Le nom d'enregistrement et le format de l'image sont dans la table images...

    Pour récupérer la liste des images utilisées par l'internaute pour illustrer l'article j'utilise la requête suivante (Me retourne 6 résultats) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM article_image AI, images IM WHERE AI.fk_id_article = '1' AND AI.fk_image = IM.id_image
    Pour voir si l'image est encore utilisée sur un autre article j'utilise (Me retourne 1 résultat, l'image est donc encore utilisée par un autre article different de celui que je veux supprimer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IM.id_image FROM article_image AI, images IM WHERE AI.fk_id_article <> '1' AND AI.fk_id_image = IM.id_image
    Pour que le résultats retourné par SQL ne comporte que les images qui ne sont plus utilisées sur d'autres articles j'utilise NOT IN (J'ai également testé avec le NOT EXISTS sans plus de succès) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM article_image AI, images IM WHERE AI.fk_id_article = '1' AND AI.fk_image = IM.id_image NOT IN (SELECT IM.id_image FROM article_image AI, images IM WHERE AI.fk_id_article <> '1' AND AI.fk_id_image = IM.id_image)
    Je m'attends à recevoir 5 enregistrements, mais m'en renvoie 0...

    Quelqu'un pourrait-il m'aider ?

    Merci d'avance pour votre aide.
    Bien cordialement,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 290
    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 290
    Points : 13 004
    Points
    13 004
    Par défaut
    Bonjour,
    Il te manque une partie de la requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM article_image AI
    inner join images IM on AI.fk_image = IM.id_image 
    where AI.fk_id_article = '1' and NOT IN (SELECT IM.id_image FROM article_image AI inner join images IM on AI.fk_id_image = IM.id_image where AI.fk_id_article <> '1' )
    En indentant la requête, et en séparant la jointure de la restriction (fond en utilisant un JOIN), l'erreur saute aux yeux.
    Là tu cherches si le résultat de la comparaison (donc un booléen) est dans la liste de valeurs renvoyées par la sous-requête.

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2019
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Hello,

    Merci pour ta réponse.
    J'ai essayé, et cette fois-ci voila le problème contraire, SQL renvoie toujours tout sans prendre en compte le NOT IN...

    Pris individuellement les requetes renvoient pourtant bien individuellement 6 et 1...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM article_image AI
    inner join images IM on AI.fk_image = IM.id_image 
    where AI.fk_id_article = '1' NOT IN (SELECT IM.id_image FROM article_image AI inner join images IM on AI.fk_id_image = IM.id_image where AI.fk_id_article <> '1' )
    mais mais... j'ai remarqué le and dans ta requête, copiée telle quelle avec le and elle renvoie une erreur mais en lui indiquant où chercher "AND AI.fk_image NOT IN" ca me renvoie bien le bon résultat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM article_image AI
    inner join images IM on AI.fk_image = IM.id_image 
    where AI.fk_id_article = '1' AND AI.fk_image NOT IN (SELECT IM.id_image FROM article_image AI inner join images IM on AI.fk_id_image = IM.id_image where AI.fk_id_article <> '1' )
    Cette requête fonctionne, mais elle-elle bien fondée, n'y a-t-il pas plus simple ?

    En tout cas merci beaucoup pour ton aide précieuse

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/02/2013, 00h23
  2. Réponses: 6
    Dernier message: 09/05/2012, 19h33
  3. Importer des enregistrement d'une autre base
    Par jph86 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 21/12/2009, 07h57
  4. les rubriques d'une table sont des enregistrements d'une autre
    Par odysseus60 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/12/2007, 11h21
  5. Réponses: 2
    Dernier message: 07/12/2007, 16h20

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