aide pour formuler une requete sql-ça y est presque!!- - PHP - Programmation
Marsh Posté le 07-02-2006 à 18:25:19
Si ta version de mysql est assez récente :
"select table1.colone1,table1.colone2 ... FROM table1 t1,(SELECT identifiant,count(*) nb FROM table1 GROUP BY identifiant HAVING nb>1) t2 WHERE table1.identifiant=table2.identifiant ORDER BY table1.identifiant,table1.date"
Ca te donne pas le nom de la colone où il y a eu des changements mais ca te racourcis quand même grandement le travail.
Explication de la requette :
a premiére vu la seule chôse difficile dans cette requette, c'est de trouver une seconde requette à l'intérieur. On appelle ça une "requette imbriqué".
Pour faire simple, une requette imbriqué est à considérer comme une table virtuelle dont le contenu est le résultat de la requette.
La "requette imbriquée" de cette requette sert à chercher les identifiant comuns à plusieurs lignes et la requette principale sert à retourner les champs des lignes qui correspondent à cet identifiant.
Pour avoir ce qui a changé, il te reste à comparer, grace à php, le contenu des champs avec le contenu des champs de la lignes précédante si c'est la même personne pour les deux lignes.
Marsh Posté le 07-02-2006 à 18:34:37
ok merci!! c'est déjà une piste!!
pour comparer sur php je pense pouvoir me débrouiller...
faut que je prenne en compte le nombre des lignes si je te suis bien (?)
c'est t1 et t2 dans ta requete que je saisis pas...
et ça aussi : "GROUP BY identifiant HAVING nb>1"
en gros ça veut dire sélectionne les groupes d'identifiants qui sont en nombre supérieur à 1? (pour éviter de sélectionner une seule ligne si unique c'est ça?)
en fait l'identifiant est donné via un formulaire...ça doit ptet changer un peu la donne....
c'est la tempête sous un crâne là!!!
mais merci beaucoup pour ces infos!!! je vais pouvoir fouiner dans ce sens!!
Marsh Posté le 07-02-2006 à 19:27:34
Voila ce que je te propose, je n'ai pas testé, fais moi signe si ça marche ou pas. Je pense qu'il est indispensable traiter le résultat de la requête via le while pour afficher les changements :
Code :
|
Marsh Posté le 08-02-2006 à 08:59:26
excellent!! merci du coup de main!
il faut que je teste ça...ça rique de me prendre un peu de temps...
faut que j'adapte à ma situation exacte
mais un grand merci à vous deux! je vous tiens au courant!!
[edit] j'ai compris ton code...ça m'a l'air adapté à mon besoin, c'est vraiment sympa de m'avoir écrit ça! je vais pouvoir taffer dessus!
le truc (je vais voir comment ça se bidouille) je voudrais bien afficher les anciens changements d'adresse également... en gros si tu veux ça fera une "tracabilité" totale de la personne...si elle change 4 fois de logement dans l'année, deux fois de nom etc... me fera autant de ligne que de changements...
mais ton code c'est déjà ENORME pour moi...
merci encore!!!
++
Marsh Posté le 08-02-2006 à 11:07:20
flock86 a écrit : ok merci!! c'est déjà une piste!! |
Je viens de me relire, et c'est normal que t1 et t2 te semblent compliqué vu qu'aprés je les utilisent plus.
En fait, t1 est un alias de la table "table1" et t2 un alias de la table virtuelle généré par la requette imbriqué.
Ce qui t'as compliqué la compréhension, c'est qu'ensuite pour indiquer les champs, j'ai utilisé table1 et table2 au lieu de t1 et t2. (erreur de saisie)
Comme tu l'as compris, le "group by" permet de regrouper les lignes dont les valeurs des champs indiqué ensuite sont identique.
Comme on a mis un "count(*)" et un "group by", le "count(*)" indique le nombre de lignes correspond à chaque groupe. Le "having" situé derriére peut donc suprimer ceux qui ont plus d'un membre.
Si t'as juste les lignes d'un seul identifiant à récupérer ta requette est beaucoup plus simple et se limite donc à un simple "select" tout ce qu'il y a de classique. Côté mysql, un "mysql_num_rows()" te permettre de savoir combien de lignes sont retourné par la requette et donc s'il y a eu des changements probables (plusieurs lignes) ou aucun changement. (1 seule ligne trouvé) C'est d'ailleur exactement ce que t'as indiqué "peter45".
Marsh Posté le 08-02-2006 à 11:16:30
ouais merci beaucoup, je comprends ce que tu m'as dit (serais-je entrain de progresser?)
concernant peter45, j'ai fait des tests à partir de son code mais la pageme renvoie quelque chose de bizarre :
1) {//1 $i=0; while($aff = mysql_fetch_array($resultat))//while {if ($i ==0){//0 première ligne de résultats, c'est la plus récente $nom_actuel = $aff["nom"]; $prenom_actuel = $aff["prenom"]; $adresse_actuelle = $aff["adresse"]; }//0 if ($aff["nom"] != $nom_actuel && $stop1 != 1){//2 echo "identifiant= ".$identifiant." - cette personne a changé de nom le ".$date changement; echo "
ancien nom : ".$aff["nom"]."
nouveau nom : ".$nom_actuel; $stop2 = 1;//permet de ne pas afficher les changements de nom plus anciens }//2 if ($aff["prenom"] != $prenom_actuel && $stop2 != 1){//3 echo "identifiant= ".$identifiant." - cette personne a changé de prénom le ".$date changement; echo "
ancien prénom : ".$aff["prenom"]."
nouveau prénom : ".$prenom_actuel; $stop2 = 1;//permet de ne pas afficher les changements de prénom plus anciens }//3 if ($aff["adresse"] != $adresse_actuelle && $stop3 != 1){//4 echo "identifiant= ".$identifiant." - cette personne a changé d'adresse le ".$date changement; echo "
ancienne adresse : ".$aff["adresse"]."
nouvelle adresse : ".$adresse_actuelle; $stop3 = 1;//permet de ne pas afficher les changements d'adresse plus anciens }//4 $date changement = $aff["date"]; $i++; }//while }//1 ?>
je me suis demandé si c'était un problème de quotes ou de guillements, mais apparemment non...ou j'ai pas les yeux en face des trous...
c'est de la requete complexe à mon niveau mais je vais tenter de trouver ce qui plante.
en tous les cas merci pour votre coup de main (ouais je le dit 8 fois dans chaque post mais j'y serais pas arrivé seul sur ce coup...)
je continue dans cette voie, et attends de vos nouvelles quand même!!
chapo bas
Marsh Posté le 08-02-2006 à 11:21:52
Si t'as tout ça qui s'affiche, alors par hasard, t'aurais pas un "?>" qui traine là où il faudrait pas?
Marsh Posté le 08-02-2006 à 11:41:33
autant pour moi...
je sais pas pourquoi mais j'avais du mal regarder un truc...
en fait il n'y a pas de ?> en trop vuè qu'il n'y en a qu'un dans le code...
à la fin.
mais en revanche j'ai une faute de syntaxe (parse error) à la ligne 17...
je regarde ce que c'est...je sais que c'est toujouts pénible les quotes et les " dans ce genre de requete... vais échapper mes variables en les concaténant avec des quotes..
me penche dessu...
je vais y arriver!!!!
merci omega 2 de preter attention à mes turpitudes de noob!
(et de 9)
Marsh Posté le 08-02-2006 à 12:28:31
bon j'ai trouvé ou il ya un problème :
y'avait une variable "date_changement" qui était écrit à un moment (lignes 14 19 et 24 ) "date changement".
après, je m'y connais pas trop mais il y a cette fameuse variable qui est déclarée en fin de script.
du coup je l'ai remise avec les autres ($nom_actuel etc...)
et là ça roule....
je continue sur ma lancée de test
je vais y arriver!! (bis)
[edit]
ok ça marche presque!!
tout est presque ok peter45 t'es un chef!!!
les $stop1 et $stop2 ne sont pas définis...et yé né sais pas... faut ptet les déclarer plus tôt aussi?
voici ce que j'ai dans ma page :
Notice: Undefined variable: stop3 in c:\documents and settings\pflo123\bureau\site_demarchage\essaihistorique2.php on line 28
identifiant= abcd - cette personne a changé d'adresse le 2005-11-15
ancienne adresse : 3 rue mamie 86000 poitiers
nouvelle adresse : 3 rue grand mamie 86000 Poitiers
Notice: Undefined variable: stop1 in c:\documents and settings\pflo123\bureau\site_demarchage\essaihistorique2.php on line 17
identifiant= abcd - cette personne a changé de nom le 2005-11-14
ancien nom : Dupont
nouveau nom : Brutos
et dans mes données de la base j'ai :
id identifiant nom prenom adresse date
1 abcd Dupont Jean 3 rue papi 86000 poitiers 2005-11-12
2 abcd Dupont Jean 8 rue mamie 86000 poitiers 2005-11-13
3 abcd Brutos Jean 3 rue mamie 86000 poitiers 2005-11-14
4 abcd Brutos Jean 3 rue grand mamie 86000 Poitiers 2005-11-15
donc :
normalement je devrais avoir comme résultat :
identifiant= abcd - cette personne a changé d'adresse le 2005-11-15
ancienne adresse : 3 rue mamie 86000 poitiers
nouvelle adresse : 3 rue grand mamie 86000 Poitiers
identifiant= abcd - cette personne a changé d'adresse le 2005-11-13
ancienne adresse : 3 rue papi 86000 poitiers
nouvelle adresse : 3 rue mamie 86000 Poitiers
identifiant= abcd - cette personne a changé de nom le 2005-11-14
ancien prénom : Dupont
nouveau prénom : Brutos
entous les cas c'est vraiment cool d'avoir des mecs compétents en pour m'aider!!
Marsh Posté le 08-02-2006 à 13:10:15
je sais ce qu'il faudrait pour que ça roule pile poil :
il faudrait qu'il lise la deuxième ligne (la deuxième plus ancienne), la compare avec la première uniquement (la plus ancienne), puis qu'il prenne la 3e, la compare avec la 2e etc... jusqu' à arriver à la plus récente! et hop pour toute modification d'une ligne sur l'autre, ça m'affiche toutes les modifications dans l'ordre chronologique...
c'est presque ça en fait...
sauf que quand je vire les $stop pour m'afficher tous les changements, il me compare pas la ligne 2 avec la ligne 1 et la ligne1 avec la ligne 0, mais ligne2 ->ligne1 et ligne2->ligne0...
mais alors pour écrire le script exact c'est toujours pas de mon niveau...
si près du but!!!
c'est enorme déjà ce que vous zavez fait pour moi c'est trop coool
allez hop je me remets au turbin!! on sait jamais vais ptet y arriver !!
Marsh Posté le 08-02-2006 à 15:29:00
Si tu veux faire autant de comparaisons, alors mets tout dans un tableau et utilise les indices du tableau pour choisir les lignes à comparer.
Marsh Posté le 08-02-2006 à 16:02:36
omega2 a écrit : Si tu veux faire autant de comparaisons, alors mets tout dans un tableau et utilise les indices du tableau pour choisir les lignes à comparer. |
ok! je vais me pencher la dessus, j'y avais pas pensé (et pas près de le faire! )
je vois pas trop ce que ça peut donner pour l'instant mais bon je dirai que c'est normal, vu mon niveau de quiche!
ça va le faire au bout d'un moment...perseverance!!
sinon ptet en faisant 1 " for ($i=0, >10, $i++)"? un truc du genre ?...ché pas.
car je compare toujours en fonction de l'identifiant... j'entendais par comparaison "ligne par ligne" en fonction de l'identifiant...
vraiment désolé si j'ai pas été clair la dessus...
mais t'as sans doute raison pour le tableau!
quel monde de fou!
pour ta patience omega2!
Marsh Posté le 08-02-2006 à 20:46:02
Bonjour Flock86, j'ai vérifié le script avec une table.
Je ne pense pas qu'il soit utile de mettre les lignes de la requête dans un tableau pour effectuer de nouvelles requête à partir de ce tableau car ce que tu demandes est simple mais c'est très utile pour des cas plus complexes comme le dit omega2 ; j'ai appris cela en épluchant Phorum.
Les corrections :
voici la table :
Code :
|
voici ce que le script retourne :
Citation : identifiant= abcd - cette personne a changé d'adresse le 2005-11-15 00:00:00 |
Marsh Posté le 09-02-2006 à 08:36:09
vraiment peter45 un grand merci pour ton investissement sur mon problème!
sans déprécier la qualité des aides d'autres membres du forums (et je ne dis surtout pas ça pour toi omega2, tu m'as déjà bcp apporté dans ce post et dans d'autres auparavant), le genre de coup de main que tu me files est plutôt rare, et m'a permis d'avancer énormément sur des taches qui me seraient impossibles à réaliser à l'heure actuelle. le fait que tu m'aies filé un bout de code m'a permis de comprendre la démarche à adopter et comment le faire! génial!!
je peux te dire que j'apprécie vraiment ton aide à sa juste valeur!!
En fait, je ne sais pas si tu as lu les posts précédents (plutot longs je l'admets), mais j'avais potassé pas mal ton code pour arriver à mes fins, et j'en étais arrivé au même niveau que ce que tu m'as donné actuellement.(en 20 fois plus de temps que toi mais bon. j'y suis arrivé c'est déjà ça!)
Déjà, c'est vraiment extra ce que tu m'as filé...
là où je dis que j'y suis presque c'est que :
si on vire les $stop, pour afficher les anciens changements, ça me comparera toujours la ligne la plus récente avec une plus ancienne.
or, j'aurais besoin qu'il me compare, par exemple, l'avant-avant dernier changement d'adresse avec l'avant dernier changement d'adresse, puis l'avant dernier changement d'adresse avec le dernier changement d'adresse.
je sais pas si je suis clair, c'est toujours compliqué à formuler simplement.
je vais prendre un exemple :
tu vois dans la base il y a deux changements d'adresse : on passe d'abord de rue papi à rue mamie, puis de rue mamie à rue grand mamie.
si on vire les $stop :
ça nous comparera rue grand mamie à rue mamie -ok c'est ce qu'on veut!-
MAIS
ça nous comparera rue grand mamie à rue papi, alors qu'il faudrait qu'il compare rue mamie à rue papi !
c'est juste ça qui me bloque en fait... c'est sans doute une histoire de $i un truc comme ça...
Je peux pas te demander d'en faire plus c'est déjà beaucoup.
je sais pas comment arriver à ça encore, vu mon niveau, mais je fais tout pour en tous les cas.
j'essaye de voir la méthode d'omega2 pour les tableaux, même si j'avance au sonar plutot qu'à vue de ce coté.
mais avec la combinaison de vos aides respectives, je vais bien finir par trouver un moyen!
à moins qu'il existe, comme tu dis un moyen plus simple d'y arriver?
en tous les cas pour l'aide que tu m'apportes!
Marsh Posté le 09-02-2006 à 18:41:23
Bonjour Flock86,
Bien content de t'avoir dépanné.
@+
Marsh Posté le 10-02-2006 à 21:03:39
et bien peter 45 respect!
je n'ai pas testé ce que tu viens de me filer, mais je ne doute pas que ça me permettra d'arriver à mes fins! (au pire je rebidouillerai mais tu m'auras filé les clefs pour y arriver..et même plus!!
merci beaucoup, je potasse ça et je te préviendrai si ça marche. c'est génial!
Marsh Posté le 07-02-2006 à 18:06:29
Salut à tous!!
voilà j'ai une requete sql à faire et je vois pas comment la formuler :
j'ai une bdd qui comporte (on va simplifier à mort ) :
id en autoincrement
identifiant
nom
prenom
adresse
date d'intégration de l'info
pour éclaircir la situation je vais prendre un exemple :
id=1 identifiant=abcd nom=Dupont prénom=Jean Louis adresse : 3, rue pied de poule date=2004-01-01
id=2 identifiant=abcd nom=Dupont prénom=Jean Louis adresse : 3, rue des abrutis date=2005-05-15
id=3 identifiant=abcd nom=Brutos prénom=Jean Louis adresse : 3, rue des abrutis date=2006-11-15
je voudrais faire une requete qui me dit :
"trouve moi les lignes de la bdd pour lesquelles l'identifiant est celui que j'ai envoyé (via un formulaire). si il y a une différence dans ces lignes (exemple le changement d'adresse) affiche moi le nom du champ où c'est différent et la date d'intégration de l'info la plus récente."
en fait ce que je veux pouvoir dire après c'est :
identifiant= abcd cette personne a changé d'adresse le 2005-05-15 ancienne adresse : 3, rue pied de poule nouvelle adresse : 3, rue des abrutis
identifiant= abcd cette personne a changé de nom le 2005-11-15 ancien nom : Dupont nouveau Nom : Brutos
je suis un peu novice en php/mysql et je vois vraiment pas comment formuler une requete qui me permettrait d'avoir ce résultat...
quelq'un peut-il m'aider s'il vous plait???
merci d'avance!!
Message édité par flock86 le 08-02-2006 à 15:18:46