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 :

Chercher un enregistrement qui N'EST PAS dans une table


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Chercher un enregistrement qui N'EST PAS dans une table
    Bonjour,

    je suis persuadé que cette question a déjà été posée mais je ne vois pas du tout comment la formuler.

    j'ai 3 tables :

    facture :
    fac_id
    fac_date
    fac_montant

    reglement :
    reg_id
    reg_date
    reg_montant

    facture_has_reglement :
    fac_id
    reg_id

    Quelle requete dois je faire pour obtenir la liste des factures qui n'ont pas encore de règlements ?

    En vous remerciant par avance pour vos réponses ...

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Salut,

    Comment sais-tu que le règlement n'a pas été fait ? reg_date et supérieur à la date d'aujourd'hui ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Kwads Voir le message
    Salut,

    Comment sais-tu que le règlement n'a pas été fait ? reg_date et supérieur à la date d'aujourd'hui ?
    non ma table reglement enregistrent les règlements qui ont été faits ... je sais que le règlement n'a pas été fait si dans ma table "facture_has_reglement" je n'ai pas une paire fac_id - reg_id.

    par ex.

    dans ma table facture j'ai les fac_id : 1, 2 , 3
    dans ma table reglement j'ai les reg_id : 1, 2
    et dans ma table "facture_has_reglement" j'ai les paires : 1/1, 2/2

    je voudrais faire une requête qui puisse me dire : la fac_id 3 n'a pas de règlement.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Je suppose que les id sont en AUTO_INCREMENT. Donc tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT fact_id from facture_has_reglement where reg_id = NULL
    Ca va te sortir les lignes ou il y pas de règlement.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Kwads Voir le message
    Je suppose que les id sont en AUTO_INCREMENT. Donc tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT fact_id from facture_has_reglement where reg_id = NULL
    Ca va te sortir les lignes ou il y pas de règlement.
    si je fais ça il ne me retourne rien ... ce qui est logique puisque je n'ai de fac_id dans la table "facture_has_reglement" que pour les factures réglées.

    j'avais pensé faire une boucle du genre

    pour chaque fac_id dans la table facture
    vérifier si fac_id est dans la table "facture_has_reglement"

    mais cela risque d’être très gourmand en ressources :/

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 13
    Points
    13

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Kwads Voir le message
    merci,

    je viens de parcourir en diagonale je devrais trouver mon bonheur.

    dommage qu il n'existe pas "NOT IN" ...

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par ZeBandit Voir le message
    merci,

    je viens de parcourir en diagonale je devrais trouver mon bonheur.

    dommage qu il n'existe pas "NOT IN" ...
    Oui dommage Ca va te faire un peu modifier ton code mais tu aura le résultat voulu.

    Bonne journé

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par ZeBandit Voir le message
    dommage qu il n'existe pas "NOT IN" ...
    Citation Envoyé par Kwads Voir le message
    Oui dommage Ca va te faire un peu modifier ton code mais tu aura le résultat voulu.

    Bien sûr que NOT IN existe...

    PS : Pour info pour tester un NULL, on utilise IS [NOT] NULL et non =...

  10. #10
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut zebandit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    --------------
    select * from facture
    --------------
     
    +--------+------------+-------------+
    | fac_id | fac_date   | fac_montant |
    +--------+------------+-------------+
    |      1 | 2015-01-01 |      100.00 |
    |      2 | 2015-02-01 |      200.00 |
    |      3 | 2015-03-01 |      300.00 |
    +--------+------------+-------------+
    --------------
    select * from reglement
    --------------
     
    +--------+------------+-------------+
    | reg_id | reg_date   | reg_montant |
    +--------+------------+-------------+
    |      1 | 2015-02-25 |      100.00 |
    +--------+------------+-------------+
    --------------
    select * from facture_has_reglement
    --------------
     
    +--------+--------+
    | fac_id | reg_id |
    +--------+--------+
    |      2 |      1 |
    +--------+--------+
    --------------
    select tb1.fac_id, tb1.fac_date, tb1.fac_montant
    from facture as tb1
    where fac_id NOT IN (
            select tb2.fac_id
            from `facture_has_reglement` as tb2
            where tb1.fac_id = tb2.fac_id
    )
    --------------
     
    +--------+------------+-------------+
    | fac_id | fac_date   | fac_montant |
    +--------+------------+-------------+
    |      1 | 2015-01-01 |      100.00 |
    |      3 | 2015-03-01 |      300.00 |
    +--------+------------+-------------+
    --------------
    select tb1.fac_id, tb1.fac_date, tb1.fac_montant
    from facture as tb1
    RIGHT OUTER JOIN `facture_has_reglement` as tb2
    ON tb1.fac_id <> tb2.fac_id
    --------------
     
    +--------+------------+-------------+
    | fac_id | fac_date   | fac_montant |
    +--------+------------+-------------+
    |      1 | 2015-01-01 |      100.00 |
    |      3 | 2015-03-01 |      300.00 |
    +--------+------------+-------------+
     
    Appuyez sur une touche pour continuer...
    Sinon, la structure de ta base est un peu compliqué.
    Personnellement, je mettrais "facture" comme table père et "reglement" comme table fils.
    Pas besoin d'avoir la table "facture_has_reglement".

    Donc pour un père donné, tu peux avoir 0 fils (pas de reglements), 1 fils (un règlement partielle), N fils (N règlement partielle).
    Tu auras juste à faire la somme de tous les montant du règlement, pour voir si elle est égale au montant de la facture.

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

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut zebandit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    --------------
    select * from facture
    --------------
     
    +--------+------------+-------------+
    | fac_id | fac_date   | fac_montant |
    +--------+------------+-------------+
    |      1 | 2015-01-01 |      100.00 |
    |      2 | 2015-02-01 |      200.00 |
    |      3 | 2015-03-01 |      300.00 |
    +--------+------------+-------------+
    --------------
    select * from reglement
    --------------
     
    +--------+------------+-------------+
    | reg_id | reg_date   | reg_montant |
    +--------+------------+-------------+
    |      1 | 2015-02-25 |      100.00 |
    +--------+------------+-------------+
    --------------
    select * from facture_has_reglement
    --------------
     
    +--------+--------+
    | fac_id | reg_id |
    +--------+--------+
    |      2 |      1 |
    +--------+--------+
    --------------
    select tb1.fac_id, tb1.fac_date, tb1.fac_montant
    from facture as tb1
    where fac_id NOT IN (
            select tb2.fac_id
            from `facture_has_reglement` as tb2
            where tb1.fac_id = tb2.fac_id
    )
    --------------
     
    +--------+------------+-------------+
    | fac_id | fac_date   | fac_montant |
    +--------+------------+-------------+
    |      1 | 2015-01-01 |      100.00 |
    |      3 | 2015-03-01 |      300.00 |
    +--------+------------+-------------+
    --------------
    select tb1.fac_id, tb1.fac_date, tb1.fac_montant
    from facture as tb1
    RIGHT OUTER JOIN `facture_has_reglement` as tb2
    ON tb1.fac_id <> tb2.fac_id
    --------------
     
    +--------+------------+-------------+
    | fac_id | fac_date   | fac_montant |
    +--------+------------+-------------+
    |      1 | 2015-01-01 |      100.00 |
    |      3 | 2015-03-01 |      300.00 |
    +--------+------------+-------------+
     
    Appuyez sur une touche pour continuer...
    Sinon, la structure de ta base est un peu compliqué.
    Personnellement, je mettrais "facture" comme table père et "reglement" comme table fils.
    Pas besoin d'avoir la table "facture_has_reglement".

    Donc pour un père donné, tu peux avoir 0 fils (pas de reglements), 1 fils (un règlement partielle), N fils (N règlement partielle).
    Tu auras juste à faire la somme de tous les montant du règlement, pour voir si elle est égale au montant de la facture.

    @+
    Merci pour ta réponse

    je suis obligé de passer par une 3eme table parce qu'une facture peut avoir plusieurs règlements et qu'un règlement peut couvrir plusieurs factures.

    j'avais trouvé cette solution aussi :

    SELECT fac_numero, fac_date, fac_montant, fac_supplement, fac_tva, mode_paiement_mod_pai_id FROM facture as F
    INNER JOIN facture_has_reglement as FR
    ON F.fac_id != FR.facture_fac_id
    ORDER BY fac_date

  12. #12
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut ZeBandit.

    Citation Envoyé par zebandit
    je suis obligé de passer par une 3eme table parce qu'une facture peut avoir plusieurs règlements et qu'un règlement peut couvrir plusieurs factures.
    Et comment fais-tu pour distinguer que tel montant va vers telle facture ?

    Je prends un exemple un peu complexe.
    Admettons qu'une même personne paye en plusieurs fois (règlements) pour des raison budgétaire le solde de ses factures.
    --> reg1 = 500€, reg2 = 300€, reg3 = 200€

    total = 1.000€.

    Le nombre de factures émises est de 7.
    --> fac1 = 150€, fac2 = 225€, fac3 = 175€, fac4 = 250€, fac5 = 90€, fac6 = 60€, fac7 = 50€

    total = 1.000€

    Tu constates que la totalité du montant des règlements est identique à la totalité du montant des factures.
    Mais il n'y a aucun correspondance entre ces montants. Ceci est le cas général. Donc comment penses-tu résoudre ce problème ?
    Après, on pourra envisager de de trouver une solution. Si tu veux résoudre un problème, commence par bien le poser.

    Je ne pense pas que tu reçois des règlements de la société X pour payer les factures de la société Y.
    Le point commun entre factures et règlements est bien le client.
    Donc la table père doit être le client, qui possède deux fils, l'un est la facture et l'autre le règlement.
    De plus, tu dois faire apparaître dans client le montant restant dû.
    Chaque nouveau règlement vient décrémenter ce solde. Chaque nouvelle facture vient incrémenter ce solde.
    C'est quand même plus simple à gérer que de faire des requêtes à plusieurs tables.

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

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Alors première chose : vous me faites peur.

    Solution à la question TELLE QU'ELLE EST DEMANDEE :

    facture :
    fac_id
    fac_date
    fac_montant

    reglement :
    reg_id
    reg_date
    reg_montant

    facture_has_reglement :
    fac_id
    reg_id

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select f.fac_id
    from facture f
    left outer join facture_has_reglement fhr on fhr.fac_id = f.fac_id
    where fhr.reg_id is null

    Variante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select f.fac_id
    from facture f
    left outer join facture_has_reglement fhr on fhr.fac_id = f.fac_id
    group by f.fac_id
    having count(fhr.*) = 0

    La requête qui répond à l'expert comptable qui n'en a rien à foutre de savoir si une facture a un règlement ou non, mais s'il reste des choses à payer dedans :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select f.fac_id
    from facture f
    left outer join facture_has_reglement fhr on fhr.fac_id = f.dac_id
    group by f.ac_id
    having min(f.montant) > sum(fhr.montant)

    Et je rejoins Artemus24 : facture_has_reglement devrait contenir une colonne "montant" (ce que j'ai supposé) pour pouvoir déterminer quelle quantité du règlement est imputée sur chaque commande. A défaut, on partira du principe qu'on solde les factures les plus anciennes (ou arrivant les premières à échéance) en premier, mais je ne suis pas certain que MySQL support les fonction analytiques...
    On ne jouit bien que de ce qu’on partage.

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    je ne suis pas certain que MySQL support les fonction analytiques...
    À ma connaissance, toujours pas !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/05/2011, 11h50
  2. Lister les enregistrements qui ne sont pas dans une table
    Par toss.net dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/10/2010, 11h25
  3. Rajouter un champs qui n'est pas dans la table
    Par robbiano78 dans le forum Hibernate
    Réponses: 9
    Dernier message: 19/08/2009, 11h26
  4. elements qui n'est pas dans une liste
    Par KEnder dans le forum Général Python
    Réponses: 2
    Dernier message: 16/05/2008, 01h52
  5. selectionner un resultat qui n'est pas dans une autre requete
    Par yosraisi dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/05/2008, 13h17

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