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 :

Structure de requête complexe (non correspondance + ss-requête ? autre ?) [MySQL-5.1]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Par défaut Structure de requête complexe (non correspondance + ss-requête ? autre ?)
    Bonsoir,

    Désolé pour le titre peu explicite, je vais tâcher d'être plus clair dans ma demande.

    Je suis en train de faire un référentiel web avec diverses fiches sur différents thèmes, qui ont chacune à la fin une section biblio.

    Je dispose de 3 tables :

    t_fiches
    > id_fiche (auto-increment)
    > texte_fiche
    > auteur_fiche
    > date_fiche
    > etc.

    t_biblio (1 entrée = 1 référence biblio)
    > id_ref (auto-increment)
    > titre_ref
    > etc.

    t_corres
    > id_corres (auto-increment)
    > id_fiche
    > id_ref

    La table t_corres fait le lien entre les fiches et les références biblio : une même fiche peut avoir plusieurs références biblio, une même référence biblio peut être citée dans plusieurs fiches.

    Pour une fiche donnée, pour avoir toutes les références biblio détaillées, je fais une requête de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM t_biblio INNER JOIN t_corres ON t_biblio.id_ref = t_corres.id_ref WHERE t_corres.id_fiche = :id_fiche
    Jusque là, aucun souci.



    La table t_corres contiendra par exemple les valeurs suivantes :

    id_corres id_fiche id_ref
    1 1 1
    2 1 3
    3 1 4
    4 2 2
    5 2 4
    6 3 5


    et la table t_biblio 6 références bibliographiques notées (id_ref) 1 à 6.


    Ce que je veux faire...
    Dans ma section "admin", je veux pouvoir ajouter facilement une référence à une fiche. Pour cela, je veux afficher la liste de toutes les références biblio qui ne sont pas déjà rattachées à la fiche pour pouvoir piocher dedans (mais donc sans afficher celles déjà rattachées).

    Avec l'exemple ci-dessus, ma requête doit me sortir :
    - pour la fiche 1 : références 2, 5, 6
    - pour la fiche 2 : références 1, 3, 5, 6
    - pour la fiche 3 : références 1, 2, 3, 4, 6

    The question... : Le seul moyen que j'imagine pour l'instant, c'est une requête de non-correspondance liée sur id_ref entre la table t_biblio et une sous-requête [SELECT * FROM t_corres WHERE id_fiche = :id_fiche]
    ...mais je ne connais pas toutes les subtilités et possibilités de MySQL : peut-être existe-t-il une fonction / un moyen plus simple ?


    Merci à toi qui a pris le temps de lire jusque là pour ton avis éclairé

    BM

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 007
    Billets dans le blog
    6
    Par défaut
    Apprenez le langage SQL... Mon site web comme mon bouquin peuvent vous y aider.
    Vous y découvrirez plusieurs façons de faire :
    • NOT IN
    • NOT EXISTS
    • EXCEPT
    • <> ALL


    ...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour

    Vous pouvez faire une jointure externe comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT b.id_ref
    FROM t_biblio b
    LEFT JOIN t_corres c
        ON c.id_ref = b.id_ref
        AND c.id_fiche = :id_fiche
    WHERE c.id_fiche IS NULL

  4. #4
    Membre averti
    Homme Profil pro
    Touriste en programmation
    Inscrit en
    Janvier 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Touriste en programmation
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 49
    Par défaut
    Bonsoir, et merci à tous les 2 d'avoir pris le temps de répondre.

    Merci pour ta proposition concrète, aïeaïeaïe : j'avais eu une idée de ce type, mais que je n'avais pas réussi à mettre en forme. Et puis je me demandais si c'était bien valable comme raisonnement. Je vais tester ça rapidement.
    EDIT : Ca marche nickel : merci !

    Et merci pour ton conseil, SQLPro. Même si je suis convaincu que tu as raison, mes disponibilités ne sont malheureusement pas celles que je voudrais, et mon utilisation des SGBD quels qu'ils soient est trop ponctuelle et épisodique pour justifier de consacrer quelques heures d'apprentissage. Pour reprendre ton exemple, on ne passe pas le permis de conduire quand on n'a que le projet de faire une balade en quad : on demande des tuyaux pour les manip de base à ceux qui savent bien s'en servir, et on se lance. Mais le jour où je me mettrai à programmer régulièrement, promis, je saurai où venir chercher les infos pour "passer mon permis"

    BM

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

Discussions similaires

  1. "Opération annulée" sur requête de non-correspondance
    Par tedparker dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 23/11/2009, 17h18
  2. Requête de non correspondance et Ajout
    Par gentoo dans le forum Access
    Réponses: 5
    Dernier message: 29/01/2007, 13h52
  3. Requête de non correspondance.
    Par euskal75 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 29/11/2006, 16h47
  4. Réponses: 1
    Dernier message: 28/06/2006, 13h31
  5. Cas spécial de requête de non-correspondance
    Par Floch dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/06/2006, 12h19

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