Vous n'êtes pas identifié(e).
Pages :: 1
Bonjour,
Je n'arrive pas à écrire tout en SQL la requête suivante. Le but est d'obtenir une liste d'élèves : soit celle des cotisants, soit celle des non-cotisants, soit celle des deux.
[code php]
    public function RechercheParApproche($NomEleve, $PrenomEleve, $AnneeEleve, $CotisantEleve){
            if($CotisantEleve == -1){
            $SqlCotisation = "";
            $Cotisant = "
                (
                    SELECT
                        CASE
                            WHEN COUNT(*) >= 1
                            THEN true
                            ELSE false
                        END as nombre
                    FROM 
                        cotisations
                    WHERE 
                        CASE WHEN CURDATE() < STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0630'),'%Y%m%d')
                            THEN cotisations.date_achat BETWEEN 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'0701'),'%Y%m%d') AND 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d')
                            ELSE cotisations.date_achat BETWEEN 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d') AND 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE())+1,'0701'),'%Y%m%d')
                        END    AND
                        cotisations.id_eleve = eleves.id        
                )        
            ";
        }
        else{
            if($CotisantEleve == 'true'){
                $SqlCotisation = "";
                $Cotisant = 'true';
            }
            else{
                $SqlCotisation = " NOT ";
                $Cotisant = 'false';
            }
            $SqlCotisation .= "
                EXISTS (
                        SELECT
                            id
                        FROM 
                            cotisations
                        WHERE 
                            CASE WHEN CURDATE() < STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0630'),'%Y%m%d')
                                THEN cotisations.date_achat BETWEEN 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'0701'),'%Y%m%d') AND 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d')
                                ELSE cotisations.date_achat BETWEEN 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d') AND 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE())+1,'0701'),'%Y%m%d')
                            END    AND
                            cotisations.id_eleve = eleves.id        
                    ) AND
            ";
        }
        $Sql = "
            SELECT 
                eleves.*,
                $Cotisant AS cotisant        
            FROM 
                eleves
            WHERE 
                $SqlCotisation
                eleves.nom LIKE '%$NomEleve%' AND
                eleves.prenom LIKE '%$PrenomEleve%' AND
                eleves.annee LIKE '%$AnneeEleve%'
            ORDER BY 
                eleves.nom ASC, 
                eleves.prenom ASC, 
                eleves.id ASC
        ";
}
[/code]
Sous une autre forme (le WHERE et ORDER BY en moins), je voudrais faire une seule requête à la place des trois suivantes ($CotisantEleve étant alors un paramêtre ?) :
[code mysql]
SELECT 
                eleves.*,
                true AS cotisant        
            FROM 
                eleves
            WHERE 
                
                EXISTS (
                        SELECT
                            id
                        FROM 
                            cotisations
                        WHERE 
                            CASE WHEN CURDATE() < STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0630'),'%Y%m%d')
                                THEN cotisations.date_achat BETWEEN 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'0701'),'%Y%m%d') AND 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d')
                                ELSE cotisations.date_achat BETWEEN 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d') AND 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE())+1,'0701'),'%Y%m%d')
                            END    AND
                            cotisations.id_eleve = eleves.id        
                    ) 
[/code]
[code mysql]
SELECT 
                eleves.*,
                false AS cotisant        
            FROM 
                eleves
            WHERE 
                 NOT 
                EXISTS (
                        SELECT
                            id
                        FROM 
                            cotisations
                        WHERE 
                            CASE WHEN CURDATE() < STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0630'),'%Y%m%d')
                                THEN cotisations.date_achat BETWEEN 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'0701'),'%Y%m%d') AND 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d')
                                ELSE cotisations.date_achat BETWEEN 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d') AND 
                                        STR_TO_DATE(CONCAT(YEAR(CURDATE())+1,'0701'),'%Y%m%d')
                            END    AND
                            cotisations.id_eleve = eleves.id        
                    ) 
[/code]
[code mysql]
SELECT 
                eleves.*,
                
                (
                    SELECT
                        CASE
                            WHEN COUNT(*) >= 1
                            THEN true
                            ELSE false
                        END as nombre
                    FROM 
                        cotisations
                    WHERE 
                        CASE WHEN CURDATE() < STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0630'),'%Y%m%d')
                            THEN cotisations.date_achat BETWEEN 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'0701'),'%Y%m%d') AND 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d')
                            ELSE cotisations.date_achat BETWEEN 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE()),'0701'),'%Y%m%d') AND 
                                    STR_TO_DATE(CONCAT(YEAR(CURDATE())+1,'0701'),'%Y%m%d')
                        END    AND
                        cotisations.id_eleve = eleves.id        
                )        
             AS cotisant        
            FROM 
                eleves
[/code]
Dernière modification par moijhd (19-07-2010 21:22:42)
Hors ligne
Bonjour,
Si j'ai bien compris ton problème, tu as la table élèves contenant tous les élèves, la table cotisations contenant tous les élèves ayant cotisés, et tous ceux qui n'ont pas cotisé, ne sont pas présent dans la table cotisations. A partir de là, tu souhaites établir "une liste d'élèves : soit celle des cotisants, soit celle des non-cotisants, soit celle des deux."
Si c'est bien ça, je te suggère de t'inspirer de la méthode que j'ai exposé dans ce post : Post forum PHPdébutants.
Cordialement,
Dernière modification par Jc (19-07-2010 23:27:01)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
J'ai parcouru le lien. C'est un peu dense...J'ai noté la redondance de l'utilisation d'UNION. Je ne sais pas si c'est ce sur quoi je dois me focaliser ?
Hors ligne
Bonsoir,
Tu ne m'a pas répondu quand à savoir si l'exposé en résumé de ton problème que j'ai fait à mon post précédent est correct.
Si c'est le cas donc, c'est en effet la méthode simple à utiliser (surtout si tu souhaites faire un tri sur ideleve=x mais elle a l'avantage de monitorer l'ensemble des élèves) car elle te permet de structurer tes résulats comme suit :
colonne 1 : id eleve
colonne 2 : cotisant (true/false)
colonne 4 : l'info que tu veux (par ex: montant de renouvellement de la cotisation / ou montant de souscription de la cotisation et ce en fonction du statut de cotisant ou non cotisant)
colonne x: l'info que tu veux
Dans le post tu as toutes les règles à utiliser pour que ta requête union fonctionne.
Si tu as besoin d'un coup de main fait moi signe. Mais si c'est le cas, faudra que tu m'expliques bien comment sont structurées tes tables et l'utilisation que tu en fait (pour les champs utilisés dans ta requête), sinon difficile de t'aider dans ta requête union.
++
Dernière modification par Jc (20-07-2010 22:14:17)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Pages :: 1