trouver des enregistrements en fction d'un seuil

Mammouth du PHP | 19672 Messages

11 oct. 2005, 11:17

:shock: Non mais je rêve complètement là.....
regarde dans phpMyAdmin, il y a un bouton marqué [Exporter] : je veux bien t'aider, mais faudrait un minimum quand même, je vais pas me farcir de recréer la base à la main, génère un fichier sql et colle ça entre deux balises [code][/code]
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 289 Messages

11 oct. 2005, 11:33

Code : Tout sélectionner

# # Structure de la table `points` # CREATE TABLE `points` ( `ID` mediumint(4) NOT NULL auto_increment, `Numdossier` text NOT NULL, `Operations` text NOT NULL, `Zones` text NOT NULL, `Points` text NOT NULL, `Heure` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`ID`) ) TYPE=MyISAM AUTO_INCREMENT=661 ; # # Contenu de la table `points` # INSERT INTO `points` VALUES (22, '49', '8', '1', '414', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (21, '49', '7', '1', '276', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (13, '27', '3', '3', '1', '2005-02-15 00:00:00'); INSERT INTO `points` VALUES (12, '27', '1', '3', '100', '2005-02-15 00:00:00'); INSERT INTO `points` VALUES (20, '49', '5', '1', '90', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (10, '27', '2', '2', '34', '2005-02-14 00:00:00'); INSERT INTO `points` VALUES (9, '27', '3', '1', '100', '2005-02-13 00:00:00'); INSERT INTO `points` VALUES (8, '27', '1', '1', '2345', '2005-02-12 00:00:00'); INSERT INTO `points` VALUES (19, '49', '2', '1', '1290', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (23, '45', '2', '1', '765', '2005-02-24 00:00:00'); INSERT INTO `points` VALUES (24, '45', '3', '1', '228', '2005-02-24 00:00:00'); INSERT INTO `points` VALUES (25, '45', '9', '1', '192', '2005-02-24 00:00:00'); INSERT INTO `points` VALUES (26, '45', '10', '1', '149', '2005-02-24 00:00:00'); # # Structure de la table `registre` # CREATE TABLE `registre` ( `ID` mediumint(4) NOT NULL auto_increment, `NumDossier` varchar(15) NOT NULL default '', `NumOT` varchar(16) NOT NULL default '', `NumPompe` varchar(9) NOT NULL default '', `Marques` text NOT NULL, `Models` text NOT NULL, `Secteur` text NOT NULL, `Urgence` varchar(5) NOT NULL default '0', `Datedebut` datetime NOT NULL default '0000-00-00 00:00:00', `Datefin` datetime default '0000-00-00 00:00:00', `Heure` varchar(50) NOT NULL default '', `Cloture` varchar(4) default 'non', `Totalpoint` text, `Avisot` text NOT NULL, `Typefacture` text NOT NULL, PRIMARY KEY (`ID`) ) TYPE=MyISAM AUTO_INCREMENT=286 ; # # Contenu de la table `registre` # INSERT INTO `registre` VALUES (51, '9608/0', '15030137126-0010', 'PE 2466', '12', '22', '43', '3', '2005-02-25 14:00:00', '0000-00-00 00:00:00', '2005-02-25 13:58:03', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (21, '- num dossier -', '', '', '', '', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', 'non', '', '', ''); INSERT INTO `registre` VALUES (52, '9610/0', '15030138301-0010', 'PDCE 0182', '8', '25', '44', '2', '2005-02-28 16:00:00', '0000-00-00 00:00:00', '2005-02-28 15:50:34', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (48, '9603/0', '15030136671-0010', 'PMP 1483', '10', '20', '51', '2', '2005-02-23 11:05:00', '0000-00-00 00:00:00', '2005-02-23 11:01:13', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (49, '9558/0', '15030131756-0010', 'PE 2590', '6', '8', '42', '2', '2005-02-18 15:00:00', '0000-00-00 00:00:00', '2005-02-23 14:49:28', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (50, '9607/0', '15030136672-0010', 'PMP 1455', '11', '21', '51', '1', '2005-02-24 11:45:00', '0000-00-00 00:00:00', '2005-02-24 11:43:16', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (45, '9601/0', '15030136659-0010', 'PDCE 0631', '9', '18', '51', '2', '2005-02-22 09:20:00', '0000-00-00 00:00:00', '2005-02-23 09:16:58', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (53, '9611/0', '15030138302-0010', 'PD 0409', '13', '24', '54', '2', '2005-02-28 16:00:00', '0000-00-00 00:00:00', '2005-02-28 15:52:40', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (54, '9612/0', '15030138308-0010', 'PA 1567', '9', '26', '45', '2', '2005-03-01 14:45:00', '0000-00-00 00:00:00', '2005-03-01 14:39:58', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (55, '9613/0', '15030138309-0010', 'PA 1344', '2', '13', '45', '2', '2005-03-01 14:45:00', '0000-00-00 00:00:00', '2005-03-01 14:41:25', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (56, '9622/0', '15030138877-0010', 'PMP 1468', '9', '27', '51', '2', '2005-03-07 16:00:00', '0000-00-00 00:00:00', '2005-03-07 15:46:06', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (57, '9623/0', '15030139515-0010', 'PDCE 615', '14', '28', '43', '2', '2005-03-08 09:30:00', '0000-00-00 00:00:00', '2005-03-08 09:33:42', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (58, '9631/0', '15030140721-0010', 'PE 2533', '6', '29', '44', '1', '2005-03-15 12:00:00', '0000-00-00 00:00:00', '2005-03-16 07:45:15', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (59, '9635/0', '15030142397-0010', 'PE 1777', '10', '30', '42', '3', '2005-03-17 10:30:00', '0000-00-00 00:00:00', '2005-03-17 10:29:11', 'oui', NULL, '', '1');

dsl, :oops: , je ne me souvenais plus qu'en exportant on avait les données aussi!!!

PS: je trouvais ca clair moi :wink:
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Mammouth du PHP | 19672 Messages

11 oct. 2005, 11:39

Ok, je vais faire des tests et je reviens avec le résultat dès que je le trouve.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

11 oct. 2005, 11:48

On voit bien que ses valeurs de dates ont le même format que celles comparées, y'a pas besoin de test alors.
Mais l'erreur est que la valeur d'une date doit être traitée comme une chaine. Il faut écrire la valeur entre quotes ou guillemets.
SELECT registre.NumDossier, registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Secteur, registre.Urgence, registre.Datedebut, registre.Cloture, SUM( points.Points ) AS test
FROM registre, points
WHERE registre.ID = points.Numdossier
AND registre.Datedebut > '2005-02-01'
AND registre.Datedebut < '2005-02-28'
GROUP BY registre.NumDossier
ORDER BY test DESC 
ou bien utiliser Between puisque c'est une plage.
SELECT registre.NumDossier, registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Secteur, registre.Urgence, registre.Datedebut, registre.Cloture, SUM( points.Points ) AS test
FROM registre, points
WHERE registre.ID = points.Numdossier
AND registre.Datedebut
BETWEEN '2005-02-01'
AND '2005-02-28'
GROUP BY registre.NumDossier
ORDER BY test DESC 
T'as au moins deux dossiers qui doivent répondre à cette requête : le 9558/0 Datedebut : 2005-02-18 et le 9601/0 Datedebut : 2005-02-22
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 19672 Messages

11 oct. 2005, 11:58

Bon, voilà la requête corrigée, comme tu vois, ça a pas été très long:

Code : Tout sélectionner

SELECT r.NumDossier, r.NumOT, r.NumPompe, r.Marques, r.Models, r.Secteur, r.Urgence, r.Datedebut, r.Cloture, SUM( p.Points ) AS test FROM registre AS r, points AS p WHERE r.ID = p.Numdossier AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') GROUP BY r.NumDossier
Voici le résultat obtenu:

Code : Tout sélectionner

+----------+------------------+-----------+---------+--------+---------+---------+--------------------+---------+-----+ |NumDossier| NumOT | NumPompe | Marques | Models | Secteur | Urgence | Datedebut | Cloture | test| +----------+------------------+-----------+---------+--------+---------+---------+--------------------+---------+-----+ |9558/0 | 15030131756-0010| PE 2590 | 6 | 8 | 42 | 2 | 2005-02-18 15:00:00| oui | 2070| |9601/0 | 15030136659-0010| PDCE 0631 | 9 | 18 | 51 | 2 | 2005-02-22 09:20:00| oui | 1334| +----------+------------------+-----------+---------+--------+---------+---------+--------------------+---------+-----+
Est-ce que c'est ce que tu attendais ?

Pourquoi ça marche alors qu'en apparence la requête est la même que la tienne ? Ce sont de petits détails parfois insignifiants qui font la différence: tu avais essayé avec TO_DAYS(2005 -02 -01) : regarde comment j'ai modifié: T_DAYS('2005-02-01') : pas d'espace dans la chaîne de la date et le tout entre apostrophes.

Ça va jusque là ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 289 Messages

12 oct. 2005, 07:32

bpnjour,

jusque la ca va, a la seule différence que si je mets "FROM registre AS r, points AS p", il y a un message d'erreur mais si je mets fraom registre, points, tout va bien!

maintenant, reste plus que l'histoire du seuil, et c gagné :wink:
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Mammouth du PHP | 19672 Messages

12 oct. 2005, 08:55

si je mets "FROM registre AS r, points AS p", il y a un message d'erreur
Ça ne me parle pas beaucoup : si tu ne précises pas quel message d'erreur, je ne devinerai sûrement pas :?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 289 Messages

12 oct. 2005, 09:04

enfait, j'avais mal lu :oops: , dsl, ca marche bien en fait!

Comme je disais, reste plus que le probleme du seuil!
tu penses avoir une solution?
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Mammouth du PHP | 19672 Messages

12 oct. 2005, 10:28

Alors reprenons parce que depius le début, il y a eu une certaine évolution et j'en ai perdu des bouts en route: quel seuil veux-tu utiliser dans ta requête ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 289 Messages

12 oct. 2005, 10:53

lol,

tu va voir, c simple comme tout!!

Je cherche a afficher tous les enregistrements compris entre 2 dates (ca, c fait) et dont la somme des points ( SUM( p.Points ) AS test ) est inferieure a une valeure qui est saisie dans une zone texte.

voila, tu vois, c tout simple :wink:
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 oct. 2005, 12:44

c'est simple comme tout, ajoute un HAVING au GROUP by de ta requête :
SELECT  r.NumDossier, 
 r.NumOT, 
 r.NumPompe, 
 r.Marques, 
 r.Models, 
 r.Secteur, 
 r.Urgence, 
 r.Datedebut, 
 r.Cloture, 
 SUM( p.Points ) AS test 
FROM registre AS r, points AS p 
WHERE r.ID = p.Numdossier 
AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') 
GROUP BY r.NumDossier
HAVING SUM( p.Points ) < $valeur_saisie
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 19672 Messages

12 oct. 2005, 16:03

...tu va voir, c simple comme tout!! ...
lol, ben oui, on en est QU'À 5 pages sur le sujet :langue:
c'est simple comme tout, ajoute un HAVING au GROUP by de ta requête :
SELECT  r.NumDossier, 
 r.NumOT, 
 r.NumPompe, 
 r.Marques, 
 r.Models, 
 r.Secteur, 
 r.Urgence, 
 r.Datedebut, 
 r.Cloture, 
 SUM( p.Points ) AS test 
FROM registre AS r, points AS p 
WHERE r.ID = p.Numdossier 
AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') 
GROUP BY r.NumDossier
HAVING SUM( p.Points ) < $valeur_saisie
Suggestion: comme le champ pour le suil est déjà aliasé, on peut peut-être utiliser l'alias?

Code : Tout sélectionner

SELECT r.NumDossier, r.NumOT, r.NumPompe, r.Marques, r.Models, r.Secteur, r.Urgence, r.Datedebut, r.Cloture, SUM( p.Points ) AS test FROM registre AS r, points AS p WHERE r.ID = p.Numdossier AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') GROUP BY r.NumDossier HAVING test < $valeur_saisie
:?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 oct. 2005, 17:51

suggestion correcte.
Le HAVING est un filtre qui ne s'applique qu'après regroupement. si il y a calcul, les champs calculés sont créés avant le HAVING et généralement après le regroupement GROUP BY.

Dans notre cas, le champ "test" qui désigne la somme (SUM) est créé après le regroupement et avant l'application du filtre HAVING, ce dernier peut alors le voir.

Contrairement à un WHERE, qui lui ne peut voir les champs calculés car il ne sont créés qu'après son application (généralement lors d'un GROUP BY explicite ou implicite)

Je rappelle que l'ordre d'exécution d'un SELECT est :
1. lecture des sources (FROM)
2. application du WHERE pour filtrage du jeu de réponse (tuple)
3. calcul avec/sans GROUP BY : création des champs calculés
4. filtrage par groupe (HAVING pour GROUP BY explicite ou implicite)
5. tri (ORDER BY) pour réorganiser le tuple
6. écriture du tuple selon la structure des champs du SELECT

On comprend alors pourquoi il est incorrect d'inclure un champ de calcul dans la clause WHERE puisque ce champ n'existe pas lors de l'application du WHERE.
Et on voit aussi pourquoi les champs de calcul sont tolérés dans les clauses HAVING et ORDER BY puisqu'ils sont créés avant
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 289 Messages

13 oct. 2005, 07:57

Bonnjour,

CA MARCHE !!!! \:D/

Franchement, je vous :love4: (en tout bien, tout honneur bien sur :wink: )

Je vous remercie de votra aide et surtout de votre patience!!!

FAb

PS:si vous etes chaud, j'ai un autre souci qui se trouve a cette adresse:
http://www.phpfrance.com/forums/voir_sujet-9265-15.php :agenouille:
:mrgreen:
je dois être la seule souris au monde qui ne fait pas peur aux néléphants ! :=)