8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je développe actuellement un logiciel de comptabilité pour mes parents, qui permet notamment de gérer leur factures. Ce logiciel comprend notamment deux tables : "factures" et "produits". La première détenant les informations relatives aux factures, et la seconde aux produits dans les factures.

Cette requête est censé comptabilisée la total d'une seule et même facture :


SELECT COUNT(DISTINCT T1.facture_reference) AS count, SUM(T2.produit_prix * T2.produit_quantite) AS total
FROM factures T1
LEFT JOIN produits T2 ON T1.facture_reference = T2.facture_reference
WHERE T1.id_client = T2.id_client AND T1.paiement IS NULL AND T1.delete_timestamp IS NULL AND T2.delete_timestamp IS NULL


Avec ce code et quelques 300 factures (ce qui n'est vraiment pas beaucoup, vous en conviendrez.), PHP met plus de 15 secondes à me charger la page ... rendant le développement du projet totalement impossible. Sachant que c'est la première fois que j'utilise les LEFT JOIN, il y a sans-doute quelque chose que je fais mal ... avez vous des idées pour améliorer cette petite syntaxe ?

Merci d'avance Smiley smile
Modifié par Gaylord.P (01 May 2011 - 16:04)
Humm ... bizarrement lorsque je remplace le "LEFT" par le "RIGHT", c'est hyper rapide. Quelqu'un pourrait-il m'expliquer brièvement ? :s

J'ai lu sur google que l'un sélectionnait les informations de droite, l'autre de gauche ... mais les informations sélectionnées ne dépendent-elles pas uniquement du Where ? Quand utiliser l'un ou l'autre ?

Merci d'avance Smiley smile
Plutôt qu'un long discours je te renvoie vers cette page assez complète sur l'usage des jointures en SQL : http://sqlpro.developpez.com/cours/sqlaz/jointures/

Au passage, l'usage de "DISTINCT" est généralement à proscrire dans le cas de grosses tables car celui-ci peut engendre des ralentissements. Dans le cas de ta requête tu dois pouvoir t'en passer facilement en tirant profit de la directive "GROUP BY".
D'accord merci beaucoup, je vais essayer d'optimiser ainsi mes requêtes. Smiley smile
Dernière question, je souhaiterais classer mes résultats par mois au sein d'une requête MySQL, sur un champs TIMESTAMP. Sur internet, j'ai lu qu'il fallait procéder ainsi :

SELECT DATE_FORMAT(create_timestamp, "%m") AS month FROM widjoo_pro_activities_invoices GROUP BY month

... mais ça ne fonctionne pas. Aurais-tu une piste ? Smiley ohwell
Encore merci Smiley smile
Le principe semble bon. En recanche il serait judicieux d'ajouter l'année si tu ne veux pas regrouper le mois de janvier 2010 et janvier 2011 par exemple.
SELECT *, DATE_FORMAT(create_timestamp, "%Y%m") AS month FROM widjoo_pro_activities_invoices GROUP BY month

Attentions cependant, la colonne create_timestamp doit être de type date ou time (http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-types.html).

Pour plus d'informations sur la manipulation des dates avec MySQL : http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html
Arf, tous mes champs sont en BIGINT, avec un timestamp d'enregistré ...

Je vais essayer de toute passer au format DATETIME. Merci beaucoup en tous cas Smiley smile