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

Langage SQL Discussion :

Simplifier une requête SQL ou essayer de la comprendre


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Simplifier une requête SQL ou essayer de la comprendre
    Bonjour tout le monde,

    Je reprends du code PHP de quelqu'un, et ce code contient une requête SQL que j'ai du mal à comprendre :

    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
    $sql = "SELECT pl.*, l.loyer, l.charges, l.locataire_id, laire.nom, 
                        laire.prenom, l.chambre_id,  c.numero, c.etage, 
                        c.maison_id, m.titre_crm 
    					FROM  (
    						SELECT spl.id, spl.location_id, spl.mois, spl.annee, spl.loyer_paye from locations sl 
    						LEFT JOIN (
    							SELECT * FROM paiement_loyer 
    							union 
    							SELECT 9999, usl.id, (MONTH(NOW())-1), YEAR(NOW()), 0 
    							FROM locations usl 
    							WHERE usl.id not in(SELECT location_id FROM paiement_loyer) || 
    								(select count(*) FROM paiement_loyer WHERE location_id=usl.id AND annee=YEAR(NOW()) AND mois=(MONTH(NOW())-1) ) = 0
    						)
    						spl ON sl.id=spl.location_id where sl.date_debut <=CURDATE() && CURDATE() <=sl.date_fin 
    					) pl
                        JOIN locations l ON pl.location_id = l.id
                        JOIN locataires laire ON l.locataire_id = laire.id
                        JOIN chambres c ON l.chambre_id = c.id
                        JOIN maisons m ON c.maison_id = m.id
                        ORDER BY trim(upper(m.titre_crm)), c.numero, annee, mois";
    C'est surtout cette partie que je ne comprends pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT spl.id, spl.location_id, spl.mois, spl.annee, spl.loyer_paye from locations sl 
    						LEFT JOIN (
    							SELECT * FROM paiement_loyer 
    							union 
    							SELECT 9999, usl.id, (MONTH(NOW())-1), YEAR(NOW()), 0 
    							FROM locations usl 
    							WHERE usl.id not in(SELECT location_id FROM paiement_loyer) || 
    								(select count(*) FROM paiement_loyer WHERE location_id=usl.id AND annee=YEAR(NOW()) AND mois=(MONTH(NOW())-1) ) = 0
    						)
    						spl ON sl.id=spl.location_id where sl.date_debut <=CURDATE() && CURDATE() <=sl.date_fin 
    					) pl
    En fait, le but est de vérifier qu'un mois ne contient pas de numéro de facture, dans ce cas, on affiche le mois avec comme loyer payé 0 :

    Le résultat de cette requête donne ceci :

    Nom : sql.png
Affichages : 241
Taille : 96,9 Ko

    Pour info, le mois 0 est janvier, 1 février...

    Si on pouvait simplifier la requête SQL ou la transformer en PHP, je dis pourquoi pas...

    Merci d'avance.

    bee

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

    Il y plusieurs pistes d'amélioration techniques :
    - requete not in à remplacer par un not exists
    - select * à remplacer par la liste des colonnes utiles
    - peut être qu'on peut remplacer l'union simple par union all
    Mais pour être sur de simplifier la requete efficacement tout en obtenant le bon résultat, il faudrait le MPD ou le MLD

    De plus je constate que le filtre "AND annee=YEAR(NOW()) AND mois=(MONTH(NOW())-1" ne fonctionnera pas si vous exécutez votre requête en janvier, puisqu'en ce cas le mois qui précède est sur l'année précédente

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour Simplifier/optimiser une requête SQL
    Par bubu06 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/05/2012, 18h25
  2. [MySQL] Simplifier une requête sql et affichage dans un tableau
    Par Debutant10 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 01/05/2012, 14h36
  3. [MySQL] Simplifier une requête SQL
    Par maestro982 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 23/05/2010, 13h26
  4. [SQL] Simplifier une requête SQL ?
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/04/2006, 13h50
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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