j'ai un probleme que je ne comprend pas sur un ordinateur je tourne sous wamp 170 et sur un autre je tourne sur wamp 172 (d'apres le changelog il y a eu changement de Mysql a la version 171).
mon probleme etant que je n'est pas le meme resultat sur les 2 ordinateurs pour une meme requete sql (avec les meme codes et données sur les 2 ordi). je suis plutot étonné de se p^robleme et je me demandé ce qui pouvais bien se passé et surtout savoir quoi faire ?
voici la requete en question :
SELECT a.dp_id_utilisateur, a.dp_date, a.dp_id_service FROM date_paiment a WHERE ( NOT EXISTS ( SELECT d.dp_date, d.dp_id_utilisateur FROM date_paiment d, services s WHERE (s.s_prix_mois > 0 AND d.dp_id_service = s.s_id AND d.dp_id_service = a.dp_id_service AND d.dp_id_utilisateur = a.dp_id_utilisateur AND DATEDIFF(CURRENT_DATE() , d.dp_date) <= -120) ) ) GROUP BY dp_id_utilisateur, dp_id_service
ça va être difficile à résoudre du fait qu'on ne possède pas tes tables et leurs données.
Il faudrait un spécialiste des requêtes SQL, ce que je ne suis pas :p
par contre tu as mis WHERE (NOT EXISTS ())
il me semble qu'il faut écrire : WHERE NOT EXISTS () ainsi que virer la parenthèse du WHERE ()
sinon aussi tu déclares 2 fois ta table date_paiment mais avec 2 noms différents.
Normalement tu dois pouvoir faire ça :
SELECT a.dp_id_utilisateur, a.dp_date, a.dp_id_service FROM date_paiment a WHERE NOT EXISTS ( SELECT s.s_prix_mois, s.s_id FROM services s WHERE s.s_prix_mois > 0 AND a.dp_id_service = s.s_id AND a.dp_id_service = a.dp_id_service AND a.dp_id_utilisateur = a.dp_id_utilisateur AND DATEDIFF(CURRENT_DATE() , a.dp_date) <= -120 ) GROUP BY a.dp_id_utilisateur, a.dp_id_service;
[EDIT] si tu as des doutes sur la validité de ta syntaxe SQL va voir sur différents sites comme par exemple : [www.jalix.org] Rubrique requêtes imbriquées.
il est vrai que je suis pas un pro en requete SQL, mais ce qui me choque c'est de ne pas avoir le meme résultat avec les 2 versions de Mysql sinon t'as requete sous wamp 172 retourne le meme resultat que la mienne mais sous wamp 170 elle retourne un resultat different de la mienne qui est faux :/
voici les 2 tables utilisé dans la requete :
CREATE TABLE `date_paiment` ( `dp_id_paiment` smallint(10) unsigned NOT NULL auto_increment, `dp_id_service` smallint(10) NOT NULL, `dp_id_utilisateur` smallint(10) NOT NULL, `dp_date` date NOT NULL, `dp_paye` binary(1) NOT NULL default '0', `db_somme_paye` double NOT NULL default '0', `dp_contrat` binary(1) NOT NULL default '1', `dp_nb_service` int(11) NOT NULL default '1', PRIMARY KEY (`dp_id_service`,`dp_id_utilisateur`,`dp_date`,`dp_contrat`), KEY `dp_id_paiment` (`dp_id_paiment`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Dates des paiments par utilisateurs et par services' AUTO_INCREMENT=27 ;
CREATE TABLE `services` ( `s_id` smallint(10) unsigned NOT NULL auto_increment, `s_intitule` varchar(100) collate utf8_unicode_ci NOT NULL, `s_duree` int(3) NOT NULL, `s_prix` double NOT NULL default '0', `s_prix_mois` double NOT NULL default '0', `s_offert` tinyint(2) NOT NULL default '0', `s_date` date NOT NULL, PRIMARY KEY (`s_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Liste des services avec les informations li�e a ceci' AUTO_INCREMENT=6 ;
le but de la requete est de trouver les clients qui ont leurs derniers paiment a effectué sous 120 jours (selon une certaine loi, il faut prevenir le client que l'echeance de son contrat aproche) et c'est precisement le but de cette requette SQL.
en attendant je fil voir le lien que tu m'a mis et merci pour ta reponse
en effet je pense aussi a un bug mais pas corrigé (qui a du apparaitre entre ces 2 versions) je te passe les tables avec les valeurs (j'ai biensur mis a 0 les tarif et autres données privé)
tu pourras constaté que pour 2 clients different ou toute les données (a 1 jour pres, mais meme si on change la date ca deconne) sont identique.
en gros je crois que je suis bon pour attendre une nouvelle mise à jour :/ quoi qu'il en soit merci de t'es réponse
-- -- Structure de la table `date_paiment` --
CREATE TABLE `date_paiment` ( `dp_id_paiment` smallint(10) unsigned NOT NULL auto_increment, `dp_id_service` smallint(10) NOT NULL, `dp_id_utilisateur` smallint(10) NOT NULL, `dp_date` date NOT NULL, `dp_paye` binary(1) NOT NULL default '0', `db_somme_paye` double NOT NULL default '0', `dp_contrat` binary(1) NOT NULL default '1', `dp_nb_service` int(11) NOT NULL default '1', PRIMARY KEY (`dp_id_service`,`dp_id_utilisateur`,`dp_date`,`dp_contrat`), KEY `dp_id_paiment` (`dp_id_paiment`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Dates des paiments par utilisateurs et par services' AUTO_INCREMENT=27 ;
Juste pour la forme car je pense que le sujet est clos ... Il n'y a pas d'erreur mysql mais une requete mal construite et aussi que sur l'ordre "naturel" d'enregistrement des entrées n'est pas le même sur les 2 tables d'où des différences de résultats lors d'un GROUP BY qui comme son nom l'indique, regroupe et retourne le 1er élement du haut de la pile...
Cette requete retournera les clients qui doivent payer entre dans les 120 jrs (ou moins) par rapport à aujourd'hui. Elle retourne le nbre de services à payer + la date la plus grande de la pile pour faire la diff entre dp_date affichée... juste pour exemple
, COUNT(DP.dp_id_service) AS nb_services, MADP.dp_date) AS diff
FROM date_paiment AS DP
INNER JOIN services AS S ON DP.dp_id_service = S.s_id
WHERE
S.s_prix_mois = 0 AND ( NOW() BETWEEN DATE_SUB( dp_date, INTERVAL 120 DAY ) AND dp_date )
GROUP BY dp_id_utilisateur
Pour optimiser il faudrait indexer 'dp_id_service' mais bon, pour 200 users mysql devrait pouvoir supporter :p Et ne pas utiliser de requêtes imbriquées si ce n'est pas utiles, ça fait 10 ans que je m'en passe et je vais bien merci ! A+