Requêtes sur plusieurs tables
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:
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' :cry:
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
Code:
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 |
Mais ça ne fonctionne pas :roll:
Je me voit donc mal faire une requête qui exploite le résultat d'une autre :oops:
Voici la structure simplifiée des tables :
Code:
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; |
Merci par avance pour votre aide.