Forum Clubic

[SQL] - Requête un peu compliquée à conceptualiser

Bon voilà j’ai une table pour mes articles endommagés, avec une clef pour le lieu des dégats et une pour la nature des dégats. (et naturellement deux tables qui donnent un nom pour chaque ID, simple quoi). Là partie difficile c’est que la date est stokée dans un table ‘lot’… un lot = X articles.

Alors ce que je voudrais faire c’est : compter pour une période donnée le nombre d’articles qui ont eu une avarie en un lieu donné… le but c’est de faire un graphique de tout ca :slight_smile:

SQL
[color=blue;font-weight:bold]SELECT[/color] natures.Nature, COUNT(chassis) FROM `vehicules`,`natures` WHERE vehicules.lieu = '$lieu' AND natures.idNature = vehicules.Nature GROUP BY natures.Nature

Ca me donne :
climatique : 28
vol : 66

Ca marche !! Mais =>

Seulement je ne sais pas comment m’en sortir avec la date en fait :confused:

J’ai tenté de faire le pont entre les vehicules (qui stockent l’id du lot auquel ils appartiennent) et la date du lot, mais bon ca marche pas… et les join je sais pas faire :confused:

SQL
[color=blue;font-weight:bold]SELECT[/color] natures.Nature, COUNT( vehicules.chassis ) , lieux.Lieu

FROM vehicules, natures, lots, lieux
WHERE vehicules.Lieu = 1 AND natures.idNature = vehicules.Nature AND vehicules.idLot = lots.idLot AND lots.dateLot
BETWEEN ‘2005-1-1’ AND ‘2005-11-31’
GROUP BY natures.Nature

Il me semble qu’il faudrait mieux faire deux requetes SQL (je peux me tromper, je suis assez débutant mais bon), la première prends donc ta première partie, la deuxième fait une selection par date.

SQL
[color=blue;font-weight:bold]SELECT[/color] natures.Nature, COUNT( vehicules.chassis ) , lieux.Lieu

FROM vehicules, natures, lots, lieux
WHERE vehicules.Lieu = 1 AND natures.idNature = vehicules.Nature AND vehicules.idLot = lots.idLot AND lots.dateLot
BETWEEN ‘2005-1-1’ AND ‘2005-11-31’
GROUP BY natures.Nature

[/quote]
Tu n’es pas obligé d’utiliser un join pour faire un jointure, les égalités sur tes id (idnature, idLot) font ta jointure, seuelement, tu n’as pas fait de jointure sur les Lieux (qqch = idLieux)
edit: en fait tu as un seul Lieu, alors il faut soit vehicules.Lieu = Lieux.idLieux soit Lieux.idLieu = 1

par mesuis de compréhension j’aurais plutot fait, pour les date :
… AND (MONTH(lots.dateLot) BETWEEN 1 AND 11) AND YEAR(lots.dateLot)=2005

:slight_smile:
et comme a dit deltree, t’as oublié la jointure sur la table des lieux

de préférence, utilise des alias de table, c’est plus pratique pour ecrire les requetes
(SELECT n.Nature, COUNT( v.chassis ),l.Lieu FROM natures n, vehicules v, lieux l …)

Ayé ca fonctionne, pas motivé pour poster le code là (faut faire un coup de clef usb ^^) :slight_smile: Merci à vous :smiley:

EDIT : 100 000 ème post du forum programmation :slight_smile: champagne !!