Archives de la liste a​i​d​e​@p​a​h​e​k​o​.c​l​o​u​d​

une erreur et deux questions SQL

yoan Texier

27/09/2020 20:33:14

Bonjour à tout le monde,

J'utilise la version 0.9.6 de Garradin sur un serveur yunohost. (merci à
celles et ceux qui œuvrent pour ces deux beaux outils)

*** intro - pas forcément utile à lire ***

L'association (un bar associatif en campagne) compte près de 2000
membres à jours de leur cotisation, et plus de 5000 dans la base de
donnée, dont un certain nombre qui seraient susceptibles de ré-adhérer
cette année.

Pour proposer la réadhésion, j'ai choisi de ne pas utiliser l'option
présente dans garradin de "Rappel automatique". Je fait donc des
recherches SQL pour connaître les personnes à jour ou non de cotisation.
Les raisons sont d'une part le risque d’atterrir en spam, mais aussi que :

Nous avons pris l'habitude de reporter les adhésions papiers (inscrites
sur un cahier) dans un tableur csv avant de les importer dans Garradin,
et il n'est actuellement pas possible d'enregistrer une cotisation lors
de l'importation. Nous avons fait le choix de ne pas renseigner les
cotisations une à une pour ces nouveaux, car ceci est fastidieux, et que
l'information de la "date d'inscription" nous suffit pour savoir quand
la personne a adhéré.

Cela complique un peu la recherche des membres à jours de cotisation,
car il faut rechercher d'une part la "date d'inscription" dans la
table
"membre" mais aussi la "date" de cotisation dans la table
"cotisations_membres"


*** Questions ***

* Lors d'une recherche SQL dans la table cotisations_membres, le lien à
droite ("petits bonhomme") pointe vers l'id de cette table là, qui ne
correspond pas à l'id_membre. On ne tombe donc pas sur la bonne fiche de
membre. *Est-il possible de modifier cela ?*

Pour reproduire l'*erreur* : SELECT * FROM cotisations_membres

* Je ne suis pas à l'aise avec les recherches SQL : Est-il possible de
rechercher "l'absence de cotisation" au delà de telle date ?

(pour l'instant, je ne sais rechercher que la "présence de cotisation",
c'est à dire que la requête renvoi les mails de toutes les personnes qui
ont adhéré entre telle date et telle date)

* Est-il possible de ne demander à sortir QUE les "emails" (inscrits
dans la table "membres") avec une condition sur les "dates" de
cotisations (inscrites dans la table "cotisation_membre")

Pour l'instant, je ne peux que sortir les mails qu'avec en plus une
colonne de la table où le WHERE agit (ici "date") :

SELECT
(SELECT m.email FROM membres AS m WHERE m.id = cm.id_membre ) email,
date
FROM cotisations_membres AS cm
WHERE cm.date>='2019-09-25'


Merci beaucoup !

Yoan

PS : si du monde est intéressé par les requêtes permettant de connaître
"qui a une adhésion enregistrée entre telle date et telle date" ou "qui
a été inscrit entre telle date et telle date", il suffit de demander !

Re: une erreur et deux questions SQL

Choeur des Centraux - le Président

27/09/2020 22:02:38

Bonsoir Yoan, pourquoi ne fais tu pas simplement une jointure entre les 
tables dans ta requête principale ?

    SELECT
    m.email
    FROM cotisations_membres AS cm, membres AS m
    WHERE cm.date>='2020-03-25'
    AND m.id=cm.id_membre

qui retourne le même nombre de résultats (je n'ai pas vérifié le détail 
désolé).

Pour ton autre question (qui n'a pas payé au delà d'une certaine date) 
il faut utiliser un "not in" : voici un exemple avec les informations 
sur les membres qui n'ont pas payé la cotisation numéro 8. Remplace 
l'intérieur de la parenthèse, adapte la requête externe, et tu devrais 
récupérer ce que tu cherches.

select
m.email,
mc.nom "Categorie",
m.civilite "Civilité",
m.nom "Nom",
m.prenom "Prénom",
m.adresse "Adresse",
m.code_postal "Code Postal",
m.ville "Ville"
from membres m, membres_categories mc
where mc.nom = "Membres actifs" and mc.id = m.id_categorie and m.id not 
in (select cm.id_membre from cotisations_membres cm where 
cm.id_cotisation = 8) order by mc.nom, m.nom, m.prenom

Bonne soirée.

Re: une erreur et deux questions SQL

BohwaZ/Garradin

28/09/2020 00:46:12

> * Lors d'une recherche SQL dans la table cotisations_membres, le lien
> à droite ("petits bonhomme") pointe vers l'id de cette table là,
qui
> ne correspond pas à l'id_membre. On ne tombe donc pas sur la bonne
> fiche de membre. *Est-il possible de modifier cela ?*

Ce n'est pas une erreur mais c'est normal : tu fait une recherche dans
les membres, donc il s'attend à ce que l'id corresponde au membre :)

Il te suffit de faire :
SELECT id_membre AS id, id AS id_ligne FROM cotisations_membres…

Bref il te suffit de donner explicitement l'ID du membre dans la liste
des colonnes :)

> * Je ne suis pas à l'aise avec les recherches SQL : Est-il possible de
> rechercher "l'absence de cotisation" au delà de telle date ?
> 
> (pour l'instant, je ne sais rechercher que la "présence de
> cotisation", c'est à dire que la requête renvoi les mails de
toutes
> les personnes qui ont adhéré entre telle date et telle date)

SELECT * FROM membres WHERE id NOT IN (SELECT id_membre FROM
cotisations_membres WHERE date > '2020-09-28');

ou une jointure c'est possible aussi (plus efficace, mais bon tant que
tu ne manipule pas des dizaines de milliers de membres ça va)

> * Est-il possible de ne demander à sortir QUE les "emails" (inscrits
> dans la table "membres") avec une condition sur les "dates"
de
> cotisations (inscrites dans la table "cotisation_membre")

Oui avec des jointures, comme l'a expliqué Jean-Pierre :)

Re: Résolu :une erreur et deux questions SQL

yoan Texier

28/09/2020 19:03:47

Merci Jean-Pierre, Merci BohwaZ, j'ai tout ce qu'il me faut, c'est super !

Yoan

Le 28/09/2020 à 00:45, BohwaZ/Garradin a écrit :
>> * Lors d'une recherche SQL dans la table cotisations_membres, le lien
>> à droite ("petits bonhomme") pointe vers l'id de cette table
là, qui
>> ne correspond pas à l'id_membre. On ne tombe donc pas sur la bonne
>> fiche de membre. *Est-il possible de modifier cela ?*
> Ce n'est pas une erreur mais c'est normal : tu fait une recherche
dans
> les membres, donc il s'attend à ce que l'id corresponde au membre
:)
>
> Il te suffit de faire :
> SELECT id_membre AS id, id AS id_ligne FROM cotisations_membres…
>
> Bref il te suffit de donner explicitement l'ID du membre dans la liste
> des colonnes :)
>
>> * Je ne suis pas à l'aise avec les recherches SQL : Est-il possible
de
>> rechercher "l'absence de cotisation" au delà de telle date
?
>>
>> (pour l'instant, je ne sais rechercher que la "présence de
>> cotisation", c'est à dire que la requête renvoi les mails de
toutes
>> les personnes qui ont adhéré entre telle date et telle date)
> SELECT * FROM membres WHERE id NOT IN (SELECT id_membre FROM
> cotisations_membres WHERE date > '2020-09-28');
>
> ou une jointure c'est possible aussi (plus efficace, mais bon tant que
> tu ne manipule pas des dizaines de milliers de membres ça va)
>
>> * Est-il possible de ne demander à sortir QUE les "emails"
(inscrits
>> dans la table "membres") avec une condition sur les
"dates" de
>> cotisations (inscrites dans la table "cotisation_membre")
> Oui avec des jointures, comme l'a expliqué Jean-Pierre :)
>