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 :

Comparer 2 requêtes pour avoir les nouveaux ou les disparus


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut Comparer 2 requêtes pour avoir les nouveaux ou les disparus
    Bonsoir à tous


    comment comparer ces 2 requêtes pour trouver soit les nouveaux adhérents GNF de la saison 6
    soit les adhérents GNF de la saison 5 qui n'ont pas repris leur adhésion GNF à la saison 6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT adherents.ID
    FROM adherents 
    INNER JOIN achats ON achats.id_adherent = adherents.ID
    WHERE achats.id_saison = 5 AND GNF = 7;
     
    SELECT adherents.ID
    FROM adherents 
    INNER JOIN achats ON achats.id_adherent = adherents.ID
    WHERE achats.id_saison = 6 AND GNF = 7;

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Tu ne dis pas où se trouve la colonne GNF et ne fournis pas de jeu de test
    => Je pars au plus simple, et pars du principe que GNF est dans achats

    trouver les nouveaux adhérents GNF de la saison 6
    => Adhérents présent sur la saison 6 et non présents sur une saison autre que 6

    SELECT ALL a.id_adherent
    FROM achats AS a
    WHERE TRUE
    	AND a.id_saison = 6 AND a.GNF = 7
    	AND NOT EXISTS (SELECT ALL * FROM achats WERE id_saison <> 6 AND id_adherent = a.id_adherent)
    ;
    soit les adhérents GNF de la saison 5 qui n'ont pas repris leur adhésion GNF à la saison 6
    => Adhérents présent sur la saison 5 et non présents sur la saison 6

    SELECT ALL a.id_adherent
    FROM achats AS a
    WHERE TRUE
    	AND a.id_saison = 5 AND a.GNF = 7
    	AND NOT EXISTS (SELECT ALL * FROM achats WERE id_saison = 6 AND id_adherent = a.id_adherent)
    ;
    On peut aussi formuler ces requêtes avec une OUTER JOIN.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    496
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 496
    Points : 123
    Points
    123
    Par défaut
    Bonsoir

    Oui excuse moi c'est bien ça GNF est une colonne de "achats"

    ça fonctionne très bien j'ai simplifié légèrement
    pourquoi faire écrire Where true And xxxx and xxxxx le true n'est pas inutile?

    en tous cas mille merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT COUNT(a.id_adherent) as nouveau
    FROM achats AS a
    INNER JOIN adherents ON a.id_adherent = adherents.ID
    WHERE a.id_saison = 6 AND a.GNF = 7
    AND NOT EXISTS (SELECT id_adherent FROM achats WHERE id_saison = 5 AND id_adherent = a.id_adherent);
     
    SELECT count(a.id_adherent) as résilié
    FROM achats AS a
    INNER JOIN adherents ON a.id_adherent = adherents.ID
    WHERE a.id_saison = 5 AND a.GNF = 7
    AND NOT EXISTS (SELECT ALL * FROM achats WHERE id_saison = 6 AND id_adherent = a.id_adherent);

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    pourquoi faire écrire Where true And xxxx and xxxxx le true n'est pas inutile?
    C'est une habitude prise pour faciliter la lecture, avec une condition par ligne :

    ...
    WHERE TRUE
        AND condition_1
        AND condition_2
        AND condition_3
    ;
    ~Plutôt que :

    ...
    WHERE condition_1 AND condition_2 AND condition_3;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Je vois pas l'intérêt du TRUE.

    Plus simple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE condition 1
      AND condition 2
      AND condition 3
    On a bien une condition par ligne, c'est facile à lire et à maintenir

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Avec une condition par ligne "réelle" on peut facilement commenter, et les conditions sont bien alignées quelque soit l'indentation.

    Je préfère ceci :

    WHERE TRUE
        -- AND condition1
        AND condition2
        AND condition3
    À cela :

    WHERE /* AND condition1
      AND */ condition2
      AND condition3


    [EDIT] Et c'est particulièrement utile quand il s'agit de construire dynamiquement des requêtes avec des paramètres optionnels :

    WHERE TRUE
        {$and($condition1, 'condition1')}
        {$and($condition2, 'condition2')}
        {$and($condition3, 'condition3')}
    Ça marche aussi avec les OR :

    WHERE FALSE
        OR condition1
        OR condition2
        OR condition3
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 066
    Points
    19 066
    Par défaut
    Salut Seb.

    Juste une question : quel est l'intérêt de mettre des conditions en commentaire quand tu as finalisé ta requête ?
    Et aussi pourquoi surcharger les conditions (le true) avec des choses qui ne servent à rien ?

    Il faut faire la distinction entre la mise au point de tes requêtes quand tu es en développement avec la mise en production où en principe, on ne touche plus à rien.

    En gros, tu es en train de nous expliquer tes bidouilles.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Et aussi pourquoi surcharger les conditions (le true) avec des choses qui ne servent à rien ?
    En gros, tu es en train de nous expliquer tes bidouilles.
    Je te rassure, ça ne sert pas à rien puisque ça me sert
    et j'explique mes "bidouilles" car on me demande à quoi elles servent.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

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

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