Bonjour,
Je travail sur un script php de gestion de membres qui tourne autour d'un forum phpbb3 pour le compte d'une association.
J'ai déjà programmer une gestion des comptes, je m'attaque maintenant à la gestion des cotisations à jour ou non.
Le but : automatiser la suppression des membres des groupes 'associations' (group_id = 7, group_id = 11) les membres actifs 2009 qui n'ont pas payés la cotisation 2010
Voici en gros l'algorithme des requêtes que je vais devoir effectuer :
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 //Req 1 : Qui a bien payé sa cotisation ? SELECT user_id FROM assoc_cotisations WHERE cotisation_annee = 2010 //' . date('Y', time() ) //Req 2 : Quels sont les groupes qui ne payent pas la cotisation ? SELECT assoc_cotisations_types.cotisation_type_id FROM assoc_cotisations_types WHERE assoc_cotisations_types.cotisation_type_montant = 0 AND assoc_cotisations_types.cotisation_type_is_enable = 1 //Req 3 : Quels sont les user_id qui ne payent pas la cotisation ? SELECT assoc_membres.user_id FROM assoc_membres WHERE assoc_membres.cotisation_type_id = {liste résultante de la requête 2} //Qui est dans les groupes 'associations' et doit payer une cotisation ? SELECT phpbb_user_group.user_id, phpbb_user_group.group_id FROM phpbb_user_group WHERE ( phpbb_user_group.group_id = 7 OR phpbb_user_group.group_id = 11 ) AND phpbb_user_group.user_id != {liste résultante des requêtes 1 et 3} //On parcours les resultats et on supprime les utilisateurs des groupes while( $row = $db->sql_fetchrow($req) ) { group_user_del( $row['group_id'], $row['user_id'] ); }
Je me demandais s'il était possible de groupe ces requêtes en 1 seule et d'un point de vue 'performance' si c'était intéressant.
(Même si c'est pas intéressant, j'aimerais savoir si c'est possible de faire ça et comment.)
J'ai regarder du coté des jointures, mais je n'arrive pas à faire de jointure 'négative'
Par exemple cette requête :
Je voudrais qu'elle me retourne les user_id de ceux qui ont pour group_id 7 et qui ne sont pas dans la table cotisations
Mais ça ne fonctionne pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT DISTINCT(phpbb_user_group.user_id, phpbb_user_group.group_id) FROM phpbb_user_group LEFT JOIN assoc_cotisations ON assoc_cotisations.user_id != phpbb_user_group.user_id WHERE phpbb_user_group.group_id = 7 ORDER BY phpbb_user_group.user_id ASC
Je me voit donc mal faire une requête qui exploite le résultat d'une autre
Voici la structure simplifiée des tables :
Merci par avance pour votre aide.
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 -- -- Structure de la table `assoc_cotisations` -- CREATE TABLE IF NOT EXISTS `assoc_cotisations` ( `cotisation_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `user_id` mediumint(8) unsigned NOT NULL, `cotisation_annee` varchar(4) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`cotisation_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- -- Structure de la table `assoc_cotisations_types` -- CREATE TABLE IF NOT EXISTS `assoc_cotisations_types` ( `cotisation_type_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, `cotisation_type_montant` float unsigned NOT NULL, `cotisation_type_is_enable` tinyint(1) unsigned NOT NULL, PRIMARY KEY (`cotisation_type_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- -- Structure de la table `assoc_membres` -- CREATE TABLE IF NOT EXISTS `assoc_membres` ( `user_id` mediumint(8) unsigned NOT NULL, `cotisation_type_id` tinyint(1) NOT NULL, ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- -- Structure de la table `phpbb_user_group` -- CREATE TABLE IF NOT EXISTS `phpbb_user_group` ( `group_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `user_id` mediumint(8) unsigned NOT NULL DEFAULT '0' ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Partager