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 :

Soustraction ou addition de deux requêtes


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut Soustraction ou addition de deux requêtes
    Bonjour à tous,

    Soit une application où j'ai une table "personnes" comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id   nom   prenom   adresse   etc
    et une table "cotisation" comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id    personne_id     annee
    Il est facile de sélectionner les personnes qui ont cotisé pour une année ou une autre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT personnes.id, personnes.nom, personnes.prenom
      FROM personnes, cotisations
     WHERE personnes.id=cotisations.personne_id 
       AND (annee=2006 OR annee=2007)
    mais comment faire pour trouver les personnes qui ont cotisé en 2006, mais pas en 2007 ?

    De même, trouver les personnes qui ont cotisé à la fois en 2006 et 2007 ?

    Merci d'avance,

    G.

  2. #2
    Membre actif
    Homme Profil pro
    Programmeur Delphi
    Inscrit en
    Octobre 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Programmeur Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 183
    Points : 227
    Points
    227
    Par défaut
    Si je comprends bien ta question

    tu veux connaître ceux qui ont cotisé pour 2006
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT personnes.id, personnes.nom, personnes.prenom
      FROM personnes, cotisations
     WHERE personnes.id=cotisations.personne_id 
       AND annee=2006
    et ceux pour 2006 et 2007
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT personnes.id, personnes.nom, personnes.prenom
      FROM personnes, cotisations
     WHERE personnes.id=cotisations.personne_id 
       AND (annee=2006 AND annee=2007)
    je pense que ca devrait fonctionner ainsi...

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Citation Envoyé par jaduta Voir le message
    tu veux connaître ceux qui ont cotisé pour 2006
    je ne crois pas que ce soit là le problème...
    Citation Envoyé par jaduta Voir le message
    et ceux pour 2006 et 2007
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT DISTINCT personnes.id, personnes.nom, personnes.prenom
      FROM personnes, cotisations
     WHERE personnes.id=cotisations.personne_id 
       AND (annee=2006 AND annee=2007)
    je pense que ca devrait fonctionner ainsi...
    Non, ça ne renverra rien, car aucune ligne n'est à la fois sur 2006 et 2007.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Citation Envoyé par gvdmoort Voir le message
    mais comment faire pour trouver les personnes qui ont cotisé en 2006, mais pas en 2007 ?
    Il faut effectivement faire deux requêtes, une pour 2006 et l'autre pour 2007, et faire une soustraction ensembliste (dite MINUS ou EXCEPT) entre les deux.
    Citation Envoyé par gvdmoort Voir le message
    De même, trouver les personnes qui ont cotisé à la fois en 2006 et 2007 ?
    Là c'est une intersection...

    ... ceci dit, MySQL ne permet ni MINUS ni INTERSECT. Il faut donc les émuler par d'autres constructions.
    Pour le MINUS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT P1.id, P1.nom, P1.prenom
      FROM personnes AS P1, cotisations AS C1
     WHERE P1.id=C1.personne_id 
       AND annee=2006 
       AND NOT EXISTS (SELECT 1
         FROM personnes AS P2, cotisations AS C2
           WHERE P2.id=C2.personne_id 
              AND P2.id = P1.id -- corrélation avec la requête principale
              AND annee=2007
        )
    Pour l'INTERSECT, même chose, avec EXISTS au lien de NOT EXISTS.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Il faut effectivement faire deux requêtes, une pour 2006 et l'autre pour 2007, et faire une soustraction ensembliste (dite MINUS ou EXCEPT) entre les deux
    Merci pour ces exemples de code, qui me permettront d'avancer dans la compréhension de SQL.

    Mais pour mon problème initial, j'avais entretemps contourné le probème de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      SELECT personnes.id, personnes.nom, personnes.prenom,
             SUM(YEAR(cotisation)) AS somme
        FROM personnes, cotisations
       WHERE personnes.id=cotisations.personne_id 
         AND (annee=2006 OR annee=2007)
    GROUP BY personnes.id
     HAVING somme=2006
    ORDER BY nom;
    Cordialement,

    G.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Je ne comprends pas du tout ton HAVING annee = 2006... HAVING COUNT(DISTINCT YEAR(cotisation)) serait bon, mais là il y a un truc qui m'échappe...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Je ne comprends pas du tout ton HAVING annee = 2006... HAVING COUNT(DISTINCT YEAR(cotisation)) serait bon, mais là il y a un truc qui m'échappe...

    Mille excuses, je poste de mémoire parce que je ne suis pas à la maison. Remplacer donc annee par cotisation. Le principe était simplement de faire la somme numérique des années de cotisation, les personnes n'ayant cotisé que la 1ère année ont une somme de 2006, les autres de 2006+2007.

    Sinon, ta proposition serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT personnes.id, personnes.nom, personnes.prenom
        FROM personnes, cotisations
       WHERE personnes.id=cotisations.personne_id 
         AND (cotisation=2006 OR cotisation=2007)
    GROUP BY personnes.id
     HAVING COUNT(DISTINCT YEAR(cotisation)) = 1 
    ORDER BY nom;
    ou ?

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    oui, je pensai à l'intersection et toi à la soustraction.

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

Discussions similaires

  1. Soustraction de résultats de deux requêtes
    Par louay02 dans le forum Sybase
    Réponses: 4
    Dernier message: 04/04/2012, 12h48
  2. Soustraction des résultats des deux requêtes sql en access
    Par samsamo dans le forum Requêtes et SQL.
    Réponses: 31
    Dernier message: 24/09/2011, 04h18
  3. Soustraction de résultats de deux requêtes
    Par ganguill dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/05/2011, 11h29
  4. Addition de deux requêtes ?
    Par bond70 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/07/2010, 14h25
  5. Addition entre deux requêtes
    Par tazmania dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/10/2006, 18h17

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