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 :

Sélectionner les éléments d'une table qui ne sont pas dans une autre


Sujet :

Langage SQL

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2025
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2025
    Messages : 1
    Par défaut Sélectionner les éléments d'une table qui ne sont pas dans une autre
    Bonjour,

    j'utilise assez peu le SQL et il y a une requête que je ne sais pas écrire, c'est probablement assez basique mais je n'ai pas les connaissances. Pour le contexte, il s'agit d'un jeu, et j'ai 2 tables :
    une première table "maps" avec une liste de maps, chaque map un identifiant "map_id" qui est la primary key de la table.
    une deuxième table "played" avec un identifiant "map_id" et un identifiant "player_id", la primary key est l'ensemble (map_id, player_id).

    A chaque fois qu'un joueur a joué une map, j'enregistre une ligne (map_id,player_id) dans la table "played".

    Si je prends un joueur, et que je veux la liste des maps qu'il a joué, je suppose que je fais un inner join entre les 2 tables en cherchant l'id du joueur, ca je dois y arriver en tâtonnant un peu sur la syntaxe.
    Par contre, si je veux la liste des maps qu'il n'a pas joué, c'est à dire qu'il existe un enregistrement dans la table "maps" mais pas d'enregistrement pour ce joueur dans la table "played", là je ne sais plus faire.

    Est ce que vous pourriez m'expliquer s'il vous plait?

    Je vous remercie d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 243
    Billets dans le blog
    16
    Par défaut
    exemple :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from maps as m
    where not exists (select * from played as p  where m.mapid = p.mapid) ;

  3. #3
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 243
    Billets dans le blog
    16
    Par défaut
    Si la recherche porte sur un joueur en particulier, par exemple 'fernand' :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from maps as m
    where not exists (select * from played as p where m.mapid = p.mapid and playerid = 'fernand') ;

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 036
    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 036
    Billets dans le blog
    6
    Par défaut
    autre solution la semi anti jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT m.* 
    FROM   maps as m
           LEFT OUTER JOIN played as p
              ON m.mapid = p.mapid
    WHERE  p.mapid IS NULL;
    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/ * * * * *

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 373
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 373
    Billets dans le blog
    17
    Par défaut
    Alternative avec l'opérateur relationnel EXCEPT :

    with
    	player (id, name) as (values row (1, 'Nicolas'), row (2, 'Julien'), row (3, 'Mathieu')),
    	map (id) as (values row (1), row (2), row (3)),
    	played (player_id, map_id) as (values row (1, 2), row (2, 3), row (2, 2))
    select all id
    from map
    except
    select all played.map_id
    from player
    inner join played on player.id = played.player_id
    where player.name = 'Nicolas'
    => "Je récupère tous les IP map exceptés ceux auxquels Nicolas a joué"

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 472
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    autre solution la semi anti jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT m.* 
    FROM   maps as m
           LEFT OUTER JOIN played as p
              ON m.mapid = p.mapid
    WHERE  p.mapid IS NULL;
    A +
    Le nom fait peur

  7. #7
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 243
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par gabi7756
    Le nom fait peur
    D’autant plus que l’opérateur en question a fait entrer inutilement le loup (NULL) dans la bergerie...

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 472
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    D’autant plus que l’opérateur en question a fait entrer inutilement le loup (NULL) dans la bergerie...

    Euh ?

  9. #9
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 243
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par gabi7756
    Euh ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     WHERE  p.mapid IS NULL
    NULL est une invention SQL, dans le contexte d’une logique trivalente (vrai, faux null). Le Modèle Relationnel de Données imposant une logique bivalente (vrai, faux) a mis NULL hors-la-loi.

    Le code SQL qui colle au Modèle Relationnel de Données est celui qu’a proposé Seb. (post #5), où EXCEPT est l'opérateur de différence :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select all id
    from map
    except
    select all played.map_id
    from player
    inner join played on player.id = played.player_id
    where player.name = 'Nicolas'

Discussions similaires

  1. afficher les lignes d'un fichier qui ne sont pas dans lun autre fichier
    Par israellita dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 11/03/2011, 11h39
  2. [MySQL] Faire une jointure entre deux tables qui ne sont pas dans la même base de données
    Par sandddy dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 03/04/2008, 14h18
  3. chercher les éléments d'une table B qui ne sont pas dans la table A
    Par Cupidon dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 11/01/2008, 13h40
  4. Réponses: 2
    Dernier message: 07/12/2007, 15h20
  5. Réponses: 10
    Dernier message: 15/12/2006, 07h34

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