[PHP / Mysql] Requete SELECT très complexe (RESOLU) - PHP - Programmation
Marsh Posté le 01-07-2005 à 19:38:23
Je dis peut-être une bêtise (j'ai pas beaucoup d'expérience en MySQL) mais avec cette requête ça donne quoi :
Code :
|
?
Marsh Posté le 01-07-2005 à 19:47:47
et un SELECT DISTINCT * ... ORDER BY num_tech ?
Le DISTINCT te permet justement de ne pas ressortir tous les enregistrements doublons
Marsh Posté le 01-07-2005 à 19:52:21
Donc j'ai mis
en premier:
Code :
|
et la il me met une belle erreur :Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\easyphp1-7
Ensuite j'ai essayé le DISTINC comme ci dessous
Code :
|
Et aucun changement il m'affiche tout les enregistrement
D'autre idées?
Marsh Posté le 01-07-2005 à 19:53:40
Ha oui forcément, la date n'est pas la même, donc les enregistrements ne sont pas identiques, donc le DISTINCT ne marche pas
Je réfléchis
Marsh Posté le 01-07-2005 à 20:34:50
hyptnos a écrit :
|
Et qu'est-ce qui ne va pas ?
Marsh Posté le 01-07-2005 à 20:50:39
Bas il me liste la premiere ligne (je n'ai que deux entrée dans la table pour le moment de quoi faire des test, je precise que les deux entrée ont le tech identique mais seule la date et le num serie change) donc il me liste le premier qui n'est pas forcement le plus recent.
Et dans sql il me rajoute un champs max(date_change)
c'est a dire que quand je tape la requete directeme nt dans mysql il me met
tech site date_change numserie max(date_change)
999 205 2004/10/21 XXXXXXX 01/07/2005
Bizarrequoi et dans la page web j'ai un enregistremet (sur 2) et c'est pas le bon
Marsh Posté le 01-07-2005 à 20:51:45
ReplyMarsh Posté le 01-07-2005 à 20:52:00
ReplyMarsh Posté le 01-07-2005 à 20:55:53
Code :
|
j'ai mis cela et il me repond une erreur mais c pas quoi j'en peu plus snifff
Marsh Posté le 01-07-2005 à 20:56:47
hyptnos a écrit :
|
pourtant c'est bon en théorie. C'est quoi le pb ?
Marsh Posté le 01-07-2005 à 20:57:10
SELECT num_tech, max( date_change ) FROM suivi_inventaire WHERE site LIKE '$site' GROUP BY date_change DESC
PS : Pourquoi > WHERE site LIKE '$site' et pas WHERE site = '$site' ?
Marsh Posté le 01-07-2005 à 20:59:35
hyptnos a écrit :
|
le where avant le group by
Marsh Posté le 01-07-2005 à 21:48:20
donc j'ai mis cecic
Code :
|
et voila ce que cela me donne
Donc 1 y a une probleme de recup d'info mais ce n'est pas la le souci meme si je comprend pas pourquoi
et 2 et surout 2 lol il me liste mes deux enregistrement alors qu'il devrait en lister qu'un
J'ai compris pourquoi il affiche pas tout car j'ai pas mis SELECT * c'est pour ca m'enfin cela n'arrange pas le pb 2 et le probleme d'origine donc
Marsh Posté le 01-07-2005 à 22:36:38
Bon bas j'abandonne pour se soir j'espere que quand je reviendrais demain des personne auront d'autre idée a me soumettre car si je pouvais avoir terminé Lundi pour le retour du boulot cela sera cool
Aller bonne nuit a tous et merci a ceux qui ont commencer a m'aider continuer comme ca ^^
Marsh Posté le 01-07-2005 à 23:36:15
hyptnos a écrit : Bas il me liste la premiere ligne (je n'ai que deux entrée dans la table pour le moment de quoi faire des test, je precise que les deux entrée ont le tech identique mais seule la date et le num serie change) donc il me liste le premier qui n'est pas forcement le plus recent. |
Nan c'est pas normal. Déjà que la requête t'affiche tout alors que tu demandes que le numéro de tech, je trouve pas ça très logique...
En tout cas,
SELECT num_tech, max(date_change) |
doit afficher pour chaque numéro de technicien la date_change la plus récente. Si ça le fait pas, balance exactement les données de ta table, qu'on puisse voir, paskeu là...
edité avec le bon group by
Marsh Posté le 02-07-2005 à 13:28:16
Bon cela ne fonctionne pas
Alors voici les données de la table
Donc jsute deux ligne pour le moment de quoi faire les test le meme agent avec une machine et une date différente ce que je veux donc c'est une requette qui me resorte le numéro de serie et l'agent pour la date la plus recente
donc la requete que tu m'as donne directement dans Mysql me donne ceci
Je vous l'avais bien dis c'est complexe lol ^^
Marsh Posté le 02-07-2005 à 13:59:33
Arrg je voulais dire
|
:x
Marsh Posté le 02-07-2005 à 15:41:26
Donc la ok cela me donne bien une ligne avec
999 et la date la plus recente
seulement ce qui m'interesse egalement c de recuperer le numéro de serie de la machine apartenant au technicien pour cette date la plus recente or j'ai repris ton code en rajoutant le champs du numéro de serie
Code :
|
OR la je recupere une ligne toujorus avec le numero de technicien la date la plus recente mais le numéro de serie correspond a celui de l'enregistrement de l'autre date et non pas au numéro de serie qui foit se trouve sur la date affiche
donc approche du but mais c'est pas encore cela
Une idée?
Marsh Posté le 02-07-2005 à 17:02:08
GROUP BY num_tech, num_serie
Marsh Posté le 02-07-2005 à 17:14:51
sielfried a écrit : GROUP BY num_tech, num_serie |
*En faisant cela il m'affiche les deux enregistrement donc ca va pas
pfeee c si complexe que cela?
Marsh Posté le 02-07-2005 à 17:24:35
hyptnos a écrit : *En faisant cela il m'affiche les deux enregistrement donc ca va pas |
A qui tu la poses la question là ?
Marsh Posté le 02-07-2005 à 17:32:39
Bas je dis cela comme ca je debute dans le monde Php/mysql je tombe sur se probleme la donc je me dis c'est normal je debute mais je m'attendais pas a ce que le probleme soit si complique a resoudre vu que pour le moment malgré les recherche des sympathique gens qui m'on aider rien de convaincant n'en n'est sortie.
je suis meme a me demander si cela est possible
Marsh Posté le 02-07-2005 à 17:46:22
hyptnos a écrit : Bas je dis cela comme ca je debute dans le monde Php/mysql je tombe sur se probleme la donc je me dis c'est normal je debute mais je m'attendais pas a ce que le probleme soit si complique a resoudre vu que pour le moment malgré les recherche des sympathique gens qui m'on aider rien de convaincant n'en n'est sortie. |
1/ Là c'est pas un pb de PHP mais de SQL (voire de modèle de données mais bon ça c'est une autre histoire ...)
2/ Ce que tu veux est possible Quelle version de Mysql utilises tu ? (dev et cible)
EDIT : Au passage, c'est clair si t'as pas un minimum vue de théorie sur les SGBDR, et notamment la théorie des ensembles, dès que tu vas quitter le cadre de simples requetes, tu risques d'être perdu ... mais si ça peut te consoler, tu seras pas le seul à avoir rencontré ce genre de problèmes
Marsh Posté le 02-07-2005 à 17:49:57
j'utilise
phpMyAdmin 2.5.3 avec MySQL 4.0.15
Ensuite oui c purement sql mais la requete devra egalement fonctionneer sous php ensuite vu que c pour un intranet
Marsh Posté le 02-07-2005 à 17:58:03
Tu peux m'expliquer en français dans le texte, le résultat que tu veux obtenir ?
Sois explicite, stp, c'est important.
Marsh Posté le 02-07-2005 à 18:06:58
Donc j'ai une table suivi_inventaire avec les champs
num_tech (numéro a trois chiffre identifiant l'utilisateur)
date_change (date du changement de machine)
num_serie (numéro de serie de la machine)
cause (cause du changement)
site (situation géographique de l'utilisateur)
Donc il y aura tout l'inventaire du parc avec l'historique des changement dans la meme et unique table
Donc j'ai deja une page qui permet de recuperer l'historique de changement avec recherche par personne ou par machine
mais maintenant je veux qui me liste l'intégralité des utilisateur d'un site avec le numéro de serie et la date de changement la plus récente
Admettons qu'il y es dans le site 201 5 utilisateurs qui sera comme sui dans la table
num tech Date site Num serie Cause
999 2005/03/12 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
234 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
321 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
434 2002/03/08 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
999 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
255 2005/08/06 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
434 2004/05/16 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
Nous voyons que 999 et 434 revient deux fois puisqu'il ont eu un changement de machine donc moi ce que je veux c avoir tout le monde mais dont la date de changement par utilisateur et la plus recente
Or ce que je veux c'est
num tech Date site Num serie Cause
999 2005/03/12 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
234 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
321 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
434 2004/05/16 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
255 2005/08/06 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
Est ce que j'ai assez bien expliquez ou est ce que cela est encore flou? je sais c pas evident d'expliquer car moi je sais c que je veu mais l'expliquer c pas facile
Sinon merci d'avace pour ton aide
Marsh Posté le 02-07-2005 à 18:24:44
hyptnos a écrit : Donc j'ai une table suivi_inventaire avec les champs |
il peut pas y avoir deux changements de machine le même jour pour le même utilisateur (le même num_tech quoi) ? oui ? non ?
Marsh Posté le 02-07-2005 à 18:34:28
Non il peu pas y avoir la meme personne qui change sa machine 2 fois le meme jour
Marsh Posté le 02-07-2005 à 18:38:15
hyptnos a écrit : Non il peu pas y avoir la meme personne qui change sa machine 2 fois le meme jour |
ha ... pour arriver à obtenir EXACTEMENT ce que tu souhaites (cad savoir pour chaque personne, quelle
est la machine en cours, la dernière quoi), il va falloir que tu modifies le type de date_change en datetime alors
Marsh Posté le 02-07-2005 à 18:39:19
hyptnos a écrit : *En faisant cela il m'affiche les deux enregistrement donc ca va pas |
Ben je passe pas mon temps à réfléchir dessus non plus, tu pourrais ptete avoir qq idées aussi, surtout que tu peux faire des tests toi...
Bon, cette fois j'y ai réfléchi un peu plus sérieusement, je pense que ceci devrait marcher :
SELECT num_tech, num_serie, max(date_change) as max_date_change |
C'est moche, cela dit. MySQL gère les sous-requêtes dans ces dernières versions, non ? Parce que ç'aurait été bien plus simple pour le coup. J'pense pas que ta version les gère cela dit.
Marsh Posté le 02-07-2005 à 18:40:08
c quoi la différence entre date et datetime
juste l'heure ne plus non?
je ne vois pas en quoi sa gene puisque y aura PAS le meme jour la meme personne avec une machine différente
Marsh Posté le 02-07-2005 à 18:46:02
hyptnos a écrit : c quoi la différence entre date et datetime |
dsl j'avais lu de travers et j'avais compris que ça pouvait arriver plus d'un changement le même jour
Donc, faut faire ça en deux étapes :
1/ tu stockes dans une table temporaires les doublets (max_date,num_tech)
2/ tu fais une jointure toute bête entre cette table temporaire et ta table pour afficher les infos que tu veux avoir voilà
Marsh Posté le 02-07-2005 à 18:57:39
Zzozo a écrit : dsl j'avais lu de travers et j'avais compris que ça pouvait arriver plus d'un changement le même jour |
Pas correct d'avoir deux tables.
Moi j'aurais essayé de faire une requête imbriquée, ie : une requête qui fait le max de la date d'une requête qui groupe par numéro de série et qui groupe aussi par date
Sinon on utilise PL/SQL et les curseurs avec Oracle pour résoudre ce problème.
Marsh Posté le 02-07-2005 à 18:58:18
hyptnos a écrit : pas compris et c pas faire lol peux tu me guider ? |
Alors ça marche pas mon truc ?
Marsh Posté le 02-07-2005 à 19:01:30
sielfried a écrit : Alors ça marche pas mon truc ? |
J'aais zapper ton message je l'avais pas vu mille excuse surtout que vien d'essayé et cela focntionne impec
merci
donc pour ce que cela interesse
Code :
|
Mais le DESC LIMIT 1 veux dire quoi?
Je vais maintenant rajouter des enregistrement bidon et faire des essai je vous redis cela mais j'aimerais surtout savoir a quoi correspond le DESC LIMIT 1
Marsh Posté le 02-07-2005 à 19:05:21
Donc cela ne va pas car il me donne qu'un seul resultat sur tout la table or moi je veux tout les utilisateur mais pour la quel la date est la pls recente pour chacun d'eux
Marsh Posté le 02-07-2005 à 19:08:47
L'usage du mot-clé limit ou de rowcount est à bannir car elle peut briser son code, à moins de savoir ce qu'on fait.
Marsh Posté le 01-07-2005 à 19:14:33
Bon tres complexe pour moi surement enfantin pour d'autre
j'explique le cas de figure:
Je dev donc un petit outils de gestion du parc info et donc j'ai une table qui me stocke les changement de pc avec ceci comme info
Donc dans la table au fil du temps sera renseigner plusieur machine pour la meme personne. logique puisque c'est un historique seulement je veux m'appuyer de cette table la pour faire une requete qui me liste l'inventaire de l'affectation c'est à dire à ce jour quel machine a partien a qui
Donc pour commencer j'ai fait un
$site est egale à $_POST['site'] que lon renseigne dans un formulaire avant
Or en faisant cela je liste pour le site voulu tout les enregistrements or cela ne me convient pas puisque j'aurais des doublons en gros cela affice
num tech Date site Num serie Cause
999 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
999 2005/03/12 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
234 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
321 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
434 2002/03/08 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
434 2004/05/16 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
255 2005/08/06 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
Or ce que je veux c'est
num tech Date site Num serie Cause
999 2005/03/12 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
234 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
321 2004/12/21 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
434 2004/05/16 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
255 2005/08/06 205 XXXXXXXXX xxxxxxxxxxxxxxxxx
VOus voyez? je veux seulement les enregistrement (sans doublon) dont la date est la plus rencente si y a plusieur enregistrement pour le meme numéro de technicien alors on prend la plus recente
J'ai essayé une requete du style
Je pensais que max( date_change) aurais fait l'affaire mais cela ne va pas.
Quelqu'un a une idée? ais je bien expliquer le probleme? si vous voulez d'autre info pas de souci
Mais pitier aider moi
Merci par avance ^^
Message édité par hyptnos le 04-07-2005 à 20:09:41