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 :

Sélection d'un champ vide d'une table


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 112
    Points : 49
    Points
    49
    Par défaut Sélection d'un champ vide d'une table
    Salut, j'ai un souscis avec ma requête. J'ai trois tables dans ma base de données :[Membres(id_membres, nom, prenom, datnais, numcni); Cotisation(id_cotisation, objet, montant, datedebut, datefin) et la table intermédiaire Paiement(id_paiement, #id_Membres, #id_cotisation, montant, type_paiement, paie, reste, date_paiement].
    En effet je veux :
    1) selectionner tous les membres qui n'ont du tout pas encore fait de paiement quelques soit la cotisation.
    2)selectionner tous les membres qui n'ont pas encore fait de paiement pour une cotisation "lambada" donnée. (Par exple: pour id_cotisation=3).

    Voici la requête je fais et qui ne me donne pas ce que je veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Membres.id_membres AS Identifiant_Membre, Paiement.id_paiement AS Identifiant_Paiement, cotisation.id_cotisation AS identifiant_cotisation, membres.nom AS NomMembre, Membres.prenom AS Prenom_Membre, Membres.numcni AS Numero_CNI, Cotisation.montant AS Montant_normal, Paiement.paie AS Payé, Paiement.reste AS Reste_à_payer 
    FROM Paiement 
    INNER JOIN Membres ON Paiement.id_membres=Membres.id_membres 
    INNER JOIN Cotisation ON paiement.id_cotisation=Cotisation.id_cotisation 
    WHERE Cotisation.id_cotisation=3 AND paiement.paie=' ';
    Merci pour toute clarté.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    bonsoir,

    j'ai adoré la notion de cotisation lambAda , cotiser en dansant est un concept heureux

    sinon pour votre besoin 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select MB.nom
         , MB.prenom
         , ...
    from membres as MB
    where not exists
         (select 1
          from paiement as PM
          where PM.id_membres=MB.id_membres)
    Et pour le besoin 2, c'est à peu près pareil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select MB.nom
         , MB.prenom
         , ...
    from membres as MB
    where not exists
         (select 1
          from paiement as PM
          where PM.id_membres=MB.id_membres
            and PM.id_cotisation=3)
    En passant, un "champs" ca n'existe pas dans une base de données. Par contre il existe des colonnes

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 112
    Points : 49
    Points
    49
    Par défaut
    bonsoir escartefigue, j'ai adoré la notion de cotisation lambAda , cotiser en dansant est un concept heureux mdrrrr...

    Je vous remercie d'abord pour l'aide:
    1)Votre 1ère reponse ne m'a rien afficher alorsque je veux selectionner tous les membres qui n'ont du tout pas encore fait de paiement quelques soit la cotisation.

    2)La 2ème réponse m'aide un peu déjà, mais je veux aussi afficher le montant que le membre doit normalement payer"Paiement.montant" ou "Cotisation.montant", la somme qu'il avance"Paiement.paie" et la somme qui lui reste à régler "Paiement.reste".

    3) Afficher tous les membres qui doivent pour une cotisation donnée (Ceux qui ont déjà payé quelques choses et même ceux qui n'ont encore rien payé pour une cotisation dont id_cotisatrion="lambda" par exemple.

  4. #4
    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
    1) Les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL qui ne sont composées que de colonnes et de lignes.

    2) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.

    3)
    selectionner tous les membres qui n'ont du tout pas encore fait de paiement quelques soit la cotisation.
    Traduction : Sélectionner tous les membres qui n'existent pas encore dans la table des paiements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT m.id_membres AS Identifiant_Membre,
    	m.nom AS NomMembre,
    	m.prenom AS Prenom_Membre, 
    	m.numcni AS Numero_CNI
    FROM Membres m
    WHERE NOT EXISTS
    (
    	SELECT *
    	FROM Paiement p
    	WHERE p.id_membres = m.id_membres
    )
    4)
    selectionner tous les membres qui n'ont pas encore fait de paiement pour une cotisation "lambada" donnée. (Par exple: pour id_cotisation=3).
    Traduction : Sélectionner tous les membres qui n'existent pas encore dans la table des paiements associés à l'id_cotisation 3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT m.id_membres AS Identifiant_Membre,
    	m.nom AS NomMembre,
    	m.prenom AS Prenom_Membre, 
    	m.numcni AS Numero_CNI
    FROM Membres m
    WHERE NOT EXISTS
    (
    	SELECT *
    	FROM Paiement p
    	WHERE p.id_membres = m.id_membres
    		AND p.id_cotisation = 3
    )
    5)
    1)Votre 1ère reponse ne m'a rien afficher alorsque je veux selectionner tous les membres qui n'ont du tout pas encore fait de paiement quelques soit la cotisation.
    Mes requêtes sont les mêmes requêtes que celles de escartefigue, au détail près que j'ai mis la réponse complète alors qu'il a résumé les siennes :
    Citation Envoyé par escartefigue
    Si vous n'avez pas de résultat, c'est peut-être tout simplement parce que tous les membres ont payé au moins une cotisation dans la première requête.

    6)
    Citation Envoyé par Busima
    La 2ème réponse m'aide un peu déjà,
    Ça veut dire que là vous avez des lignes de résultat ?

    Citation Envoyé par Busima
    mais je veux aussi afficher le montant que le membre doit normalement payer"Paiement.montant" ou "Cotisation.montant", la somme qu'il avance"Paiement.paie" et la somme qui lui reste à régler "Paiement.reste".
    Et qu'est-ce qui permet de déterminer quel id de cotisation doit payer tel membre ?

    7)
    Citation Envoyé par Busima
    Afficher tous les membres qui doivent pour une cotisation donnée (Ceux qui ont déjà payé quelques choses et même ceux qui n'ont encore rien payé pour une cotisation dont id_cotisatrion="lambda" par exemple.
    Votre besoin est peu clair. Que voulez-vous afficher ?
    Pour la seconde partie de ce besoin, même question qu'au point 6 !
    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 !

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 112
    Points : 49
    Points
    49
    Par défaut
    CinePhi, bonjour et merci.
    1) Les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL qui ne sont composées que de colonnes et de lignes.
    Je ne comprends pas cette phrase " Les champs sont à la campagne...".

    Si vous n'avez pas de résultat, c'est peut-être tout simplement parce que tous les membres ont payé au moins une cotisation dans la première requête.
    Vous avez parfaitement raison, je viens de faire la remarque. C'est ok!

    6) Ça veut dire que là vous avez des lignes de résultat ? Réponse: Oui.
    Et qu'est-ce qui permet de déterminer quel id de cotisation doit payer tel membre ?

    C'est l'objet de la cotisation qui permet de déterminer quel id de cotisation doit payer le membre, ou bien le membre demande lui même le paiement d'une cotisation donnée.
    En effet, la table "Paiement" est une table intermédiaire entre les tables "Membres" et "Cotisation", elle possède donc les clés étrangères (id_Membres et id_cotisation) que j'ai énumérées dans mon premier message posté.

    Votre besoin est peu clair. Que voulez-vous afficher ?
    Réponse: Je veux afficher le montant total que le membre doit normalement payé "Cotisation.montant"", ce qu'il a payé "Paiement.paie" et ce qui lui reste à payer "Paiement.reste", en plus du nom, prénom, numcni du membre que vous affichez déjà avec votre requête.

    7) Votre besoin est peu clair. Que voulez-vous afficher ?
    Pour la seconde partie de ce besoin, même question qu'au point 6 ![/QUOTE]

    Je demande l'affichage de tous les membres qui doivent pour une cotisation donnée (Ceux qui ont déjà payé quelques choses et même ceux qui n'ont encore rien payé pour une cotisation dont id_cotisatrion="lambda" par exemple.
    Avec la requête ci-dessous, je n'arrive à afficher que les membres qui n'ont pas encore soldé le paiement dont "paiement.id_cotisation=3", elle ne me donne pas les personnes qui n'ont encore rien payé pour le paiement dont "paiement.id_cotisation=3". Pourtant je veux avoir les 2, c'est à dire ceux qui doivent quelques chose et ceux qui n'ont même pas encore payé quelque chose (donc "paiement.paie=' ').

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT m.id_membres AS Identifiant_Membre, m.nom AS NomMembre, 
    	m.prenom AS Prenom_Membre, 
    	m.numcni AS Numero_CNI
    FROM Membres m
    WHERE NOT EXISTS
    (
    	SELECT *
    	FROM Paiement p
    	WHERE p.id_membres = m.id_membres
    		AND p.id_cotisation = 3
    );
    La requête avec sous-requête que vous avez élaborée ne me permet d'afficher seulement que les membres qui n'ont pas encore soldé la paiement et non ceux qui n'ont encore rien payé. Pourtant je veux les 2. Merci pour l'aide!

  6. #6
    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 comprends pas cette phrase " Les champs sont à la campagne...".
    C'est ma manière humoristique de faire comprendre que vous employez un mauvais vocabulaire pour désigner ce qu'on appelle une colonne de table (et pas un champ).

    C'est l'objet de la cotisation qui permet de déterminer quel id de cotisation doit payer le membre, ou bien le membre demande lui même le paiement d'une cotisation donnée.
    Alors peut-être que j'ai mal compris ou que je me suis mal exprimé. Qu'est-ce qui, dans les informations du membre (table Membres, que vous auriez dû appeler Membre au singulier mais passons...) permet de savoir quelle cotisation il doit payer ? Donc qu'est-ce qui permet de savoir quelle ligne il faudra ajouter dans la table associative Paiement ?

    En effet, la table "Paiement" est une table intermédiaire entre les tables "Membres" et "Cotisation", elle possède donc les clés étrangères (id_Membres et id_cotisation) que j'ai énumérées dans mon premier message posté.
    Oui, ça, j'avais bien compris. D'ailleurs, en tant que table associative, elle ne devrait pas avoir d'identifiant propre. Sa clé primaire devrait être constituée des clés étrangères référençant le Membre et la Cotisation objet du paiement, + sans doute la date de paiement puisque j'imagine qu'un membre peut, au fil du temps, payer plusieurs fois la même cotisation (chaque année).

    Je veux afficher le montant total que le membre doit normalement payé "Cotisation.montant"
    Et donc, pour ça, il faut bien que quelque part soit défini quelle cotisation il doit payer (la cotisation 1, la 2, la 5...). En l'état actuel de ce que vous nous avez montré de la composition de vos tables, on n'en sais rien.
    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 !

  7. #7
    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
    La requête ci-dessous devrait vous donner les membres qui ont déjà au moins payé partiellement la cotisation 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT m.id_membres AS Identifiant_Membre,
    	m.nom AS NomMembre,
    	m.prenom AS Prenom_Membre, 
    	m.numcni AS Numero_CNI,
    	c.montant AS montant_cotisation_due,
    	SUM(p.montant) AS total_paye
    FROM Membres m
    INNER JOIN Paiement p ON p.id_membres = m.id_membres
    	INNER JOIN Cotisation c ON c.id_cotisation = p.id_cotisation
    WHERE c.id_cotisation = 3
    GROUP BY m.id_membres, m.nom, m.prenom, m.numcni, c.montant
    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 !

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 112
    Points : 49
    Points
    49
    Par défaut
    Vous avez raison CinePhil, votre requête me donne bien les membres qui ont déjà au moins payé partiellement la cotisation 3, mais malheureusement elle ne fait pas correctement la somme de leur paiement. Vous vous étiez trompé sur la colonne "p.paie" en mettant "SUM(p.montant) AS total_paye" au lieu de "SUM(p.paie) AS total_paye". Malgré ma correction, ça ne fait pas correctement la somme des paiements de chaque membre.

    De plus, après cela, je souhaiterais avoir la liste de tous ceux qui doivent pour la cotisation 3 (ceux qui ont déjà payé partiellement + ceux qui n'ont encore rien payé pour la cotisation 3).


    En réponse à votre avant dernier message:

    1) Vous: Alors peut-être que j'ai mal compris ou que je me suis mal exprimé. Qu'est-ce qui, dans les informations du membre (table Membres, que vous auriez dû appeler Membre au singulier mais passons...) permet de savoir quelle cotisation il doit payer ? Donc qu'est-ce qui permet de savoir quelle ligne il faudra ajouter dans la table associative Paiement ?

    Moi: Aucune, à ce que je sache, à part les jointures. Sauf si vous me proposez une idée.

    2) Moi: En effet, la table "Paiement" est une table intermédiaire entre les tables "Membres" et "Cotisation", elle possède donc les clés étrangères (id_Membres et id_cotisation) que j'ai énumérées dans mon premier message Posté.

    Votre reponse: Oui, ça, j'avais bien compris. D'ailleurs, en tant que table associative, elle ne devrait pas avoir d'identifiant propre. Sa clé primaire devrait être constituée des clés étrangères référençant le Membre et la Cotisation objet du paiement, + sans doute la date de paiement puisque j'imagine qu'un membre peut, au fil du temps, payer plusieurs fois la même cotisation chaque année).

    Moi: C'est pas faut, mais selon ma règle de gestion (Un Membre effectue 1,n Paiement pour 1,1cotisation donnée, et, une Cotisation peut être l'objet de 1,n Paiement faits par 1,1 même Membre).
    Je pense que cette règle me permet de pouvoir enregistrer (1,n) Paiement d'un même membre pour 1 cotisation donnée, n'est-ce pas? D'ou la nécéssité de créer un ID propre à la table paiement et de prendre id_membres et id_Cotisation des tables "Membres" et "Cotisation" en foreign key. Sauf si vous me dîtes le contraire, car je suis novice.

    3) Moi: Je veux afficher le montant total que le membre doit normalement payé "Cotisation.montant".

    Votre reponse: Et donc, pour ça, il faut bien que quelque part soit défini quelle cotisation il doit payer (la cotisation 1, la 2, la 5...). En l'état actuel de ce que vous nous avez montré de la composition de vos tables, on n'en sais rien.

    Moi: A vrai dire, ce sont les structures de mes tables que je vous ai donné là, sauf si vous me dîtes d'ajouter autres choses... Amicalement!

    Dans tous les cas, n'oubliez pas aussi votre dernier message dans lequel vous m'aviez élaboré la requête.

Discussions similaires

  1. Réponses: 16
    Dernier message: 21/08/2008, 13h58
  2. champs vide d'une table
    Par salirose dans le forum Langage
    Réponses: 2
    Dernier message: 17/10/2007, 16h53
  3. Réponses: 13
    Dernier message: 20/06/2007, 16h55
  4. Test evenement sur champ vide dans une table
    Par eddyG dans le forum Access
    Réponses: 3
    Dernier message: 30/05/2006, 17h02
  5. Affectation sur un champ vide d'une table Access
    Par kurkaine dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/11/2005, 09h14

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