Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1796 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [Php/MySQL] - SELECT MAX(.. et GROUP BY, ca va pas :( [RESOLU!!!]

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[Php/MySQL] - SELECT MAX(.. et GROUP BY, ca va pas :( [RESOLU!!!]

n°240694
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:00:42  profilanswer
 

Bonjour,  
 
voila j'ai une table avec ces champ la
 
Username (login)
DateAndTime (la date et l'heure au format date time)
sfID ( ID d'un sous-forum)
 
Bref ce que je veux c'est qu'une requete me retourne groupé par sfID le dernier message posté pour chaque sfID quoi
 
la table generee doit etre comme ceci :  
 
| sfID | MAX(DateAndTime) | Username |
-------------------------------------------------------------------------
|  2    | 2002-05-03 18:00:56 | Jojo |
----------------------------------------------------
|  3    | 2002-08-03 14:04:00 | Lulu |
----------------------------------------------------
 
etc...
 
J'utilise cette requete pour faire cela :  
 
SELECT MAX(DateAndTime) AS DateTimeLastMsg,Username,sfID FROM gbb_Posts GROUP BY sfID
 
ca me parraissait correct, et bien non, il me sort bien la date la plus rescente, mais le Username associé n'est pas le bon !!! Et la je comprends vraiment pas :(
 
Merci d'avance, j'espere avoir ete clair :/


Message édité par Schtroumpheur le 15-11-2002 à 22:24:47
mood
Publicité
Posté le 06-11-2002 à 16:00:42  profilanswer
 

n°240703
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:03:59  profilanswer
 

charlene a écrit a écrit :

avoir nu MAX et un group by dans la meme requete ca me semble louche




 
Ben non !!!!!! Si je met pas de group by MySQL reponds que je dois utilisé la clause group by quand j'utilise max !!!  
 

MySQL a répondu:
 
 
Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause


Message édité par Schtroumpheur le 06-11-2002 à 16:04:17
n°240704
Fred999
Rabat-joie
Posté le 06-11-2002 à 16:04:05  profilanswer
 

Déjà, quand tu utilises un group by, veille à mettre les champs du GROUP en premier dans la liste de sélection, c'est plus propre ;)
 
Et tente de mettre tous les champs non MAX dans ton group.
 
Mais bon, j'ai rarement vu ce genre de techniques, et ne suis pas sûr à 100% de la soluce :(

n°240706
charlene
Verba volant, scripta manent
Posté le 06-11-2002 à 16:04:38  profilanswer
 

Tu peux nous montrer un exmeple qui marche pas

n°240709
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:05:05  profilanswer
 

Fred999 a écrit a écrit :

Déjà, quand tu utilises un group by, veille à mettre les champs du GROUP en premier dans la liste de sélection, c'est plus propre ;)
 
Et tente de mettre tous les champs non MAX dans ton group.
 
Mais bon, j'ai rarement vu ce genre de techniques, et ne suis pas sûr à 100% de la soluce :(




 
J'ai pas bien compris, tu peux me donné une exemple stp??

n°240710
charlene
Verba volant, scripta manent
Posté le 06-11-2002 à 16:05:26  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
Ben non !!!!!! Si je met pas de group by MySQL reponds que je dois utilisé la clause group by quand j'utilise max !!!  
 

MySQL a répondu:
 
 
Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause





Je me suis trompe en effet (d ou l effacement d emon post)

n°240712
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:05:44  profilanswer
 

charlene a écrit a écrit :

Tu peux nous montrer un exmeple qui marche pas




L'exemple qui marche pas je lai posté dans le premier post,  
 
en fait ca marche mais ca bugue, il ne met pas le bon username associé a cette date ...

n°240715
charlene
Verba volant, scripta manent
Posté le 06-11-2002 à 16:07:08  profilanswer
 

schtroumpheur a écrit a écrit :

 
L'exemple qui marche pas je lai posté dans le premier post,  
 
en fait ca marche mais ca bugue, il ne met pas le bon username associé a cette date ...



J'aimerais bien voir les tuples de la table pour voir ce qu il devrait renvoyer

n°240725
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:15:50  profilanswer
 

charlene a écrit a écrit :

J'aimerais bien voir les tuples de la table pour voir ce qu il devrait renvoyer




OK je t'envois les données exacte, encodées et ce qu'il me renvois...  
 
Données dans la table
 
Username    DAteAndTime                sfID
--------    ------------              ------
David      : 2002-11-05 09:59:36         2
Caroline   : 2002-11-05 10:00:50         2
Caroline   : 2002-11-06 12:23:54         2
Retest     : 2002-11-04 09:00:50         2
Retest     : 2002-10-03 11:00:50         2
David      : 2002-11-06 13:02:31         4
 
 
 
En resultat il me sort :
 
2002-11-06 12:23:54 : David : 2
2002-11-06 13:02:31 : David : 4


Message édité par Schtroumpheur le 06-11-2002 à 16:17:04
n°240730
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:18:05  profilanswer
 

Et ca devrait etre :  
 
2002-11-06 12:23:54 : Caroline : 2  
2002-11-06 13:02:31 : David : 4

mood
Publicité
Posté le 06-11-2002 à 16:18:05  profilanswer
 

n°240733
Fred999
Rabat-joie
Posté le 06-11-2002 à 16:20:58  profilanswer
 

Code :
  1. select sfID,
  2.        username,
  3.        max(dateandtime)
  4. from
  5.        matable
  6. group by
  7.        sfID,
  8.        username


 
Essaie ça [:spamafote]

n°240734
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:26:52  profilanswer
 

Fred999 a écrit a écrit :

Code :
  1. select sfID,
  2.        username,
  3.        max(dateandtime)
  4. from
  5.        matable
  6. group by
  7.        sfID,
  8.        username


 
Essaie ça [:spamafote]




 
 
2002-11-06 12:23:54 Caroline 2
2002-11-05 09:59:36 David 2
2002-11-04 09:00:50 Retest 2
2002-11-06 13:02:31 DAvid 4
 
 
Merci mais , ca marche pas il me separe les sfID :/

n°240740
omega2
Posté le 06-11-2002 à 16:30:23  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
 
2002-11-06 12:23:54 Caroline 2
2002-11-05 09:59:36 David 2
2002-11-04 09:00:50 Retest 2
2002-11-06 13:02:31 DAvid 4
 
 
Merci mais , ca marche pas il me separe les sfID :/



T'espère avoir quoi comme résultat?

n°240741
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:32:28  profilanswer
 

omega2 a écrit a écrit :

T'espère avoir quoi comme résultat?




 
Ben je l'ai dit plus haut...
 
J'aimerais avoir pour chaque sfID la date la plus rescente accompagnée du Username associé,
 
donc logiquement si on regroupe les sfID y  a q'une fois le meme !
 
le bug c'est qu'il n'assicié pas le bon ! regarde matable et les resultat que j'ai...  
 
 
:( :( :(
 
2 heures que je galere :/


Message édité par Schtroumpheur le 06-11-2002 à 16:33:01
n°240748
omega2
Posté le 06-11-2002 à 16:36:47  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
Ben je l'ai dit plus haut...
 
J'aimerais avoir pour chaque sfID la date la plus rescente accompagnée du Username associé,
 
donc logiquement si on regroupe les sfID y  a q'une fois le meme !
 
le bug c'est qu'il n'assicié pas le bon ! regarde matable et les resultat que j'ai...  
 
 
:( :( :(
 
2 heures que je galere :/



Ben déjà tu peux pas avoir ce résultat là en une fois.
Il faut que tu récupères d'abord le max(dateandtime) et le sfID puis dans une seconde requête le username corespondant à chaque couple de max(dateandtime),sfID retourné.

n°240753
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:40:31  profilanswer
 

omega2 a écrit a écrit :

Ben déjà tu peux pas avoir ce résultat là en une fois.
Il faut que tu récupères d'abord le max(dateandtime) et le sfID puis dans une seconde requête le username corespondant à chaque couple de max(dateandtime),sfID retourné.




 
Tu es sur qu'y a pas d'autres moyen? Paske si maintenant y a 2 fois la meme date et heure?

n°240757
Fred999
Rabat-joie
Posté le 06-11-2002 à 16:44:07  profilanswer
 

omega2 a écrit a écrit :

Ben déjà tu peux pas avoir ce résultat là en une fois.
Il faut que tu récupères d'abord le max(dateandtime) et le sfID puis dans une seconde requête le username corespondant à chaque couple de max(dateandtime),sfID retourné.




 
C'est +/- ce que je me disais.
 
Les select de groupe, c'est souvent la merdouille [:spamafote]

n°240758
Fred999
Rabat-joie
Posté le 06-11-2002 à 16:44:46  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
 
2002-11-06 12:23:54 Caroline 2
2002-11-05 09:59:36 David 2
2002-11-04 09:00:50 Retest 2
2002-11-06 13:02:31 DAvid 4
 
 
Merci mais , ca marche pas il me separe les sfID :/




 
A la réflexion, le résulatt est logique.
 
Mais j'ai peur que si tu vires le Username du group, ça merdouille...
 
Tu peux toujours essayer ceci dit :D

n°240760
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 16:50:25  profilanswer
 

Fred999 a écrit a écrit :

 
 
C'est +/- ce que je me disais.
 
Les select de groupe, c'est souvent la merdouille [:spamafote]




 
Ben oué mais j'ai besoin du username aussi, c'est domage de dvoir faire 2 requete pour ca :/ m'enfin si c la seule solution...

n°240776
omega2
Posté le 06-11-2002 à 17:03:00  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
Ben oué mais j'ai besoin du username aussi, c'est domage de dvoir faire 2 requete pour ca :/ m'enfin si c la seule solution...



C'est la seule solution que je vois du moins. S'il y en a une autre alors je vois pas laquelle.

n°240779
Sh@rdar
Ex-PhPéteur
Posté le 06-11-2002 à 17:07:43  profilanswer
 

et en faisant une jointure de la table sur elle même ??
 
tu récupère la date max regroupée par sfID
 
| date | sfID |
 
tu jointe la valeur du prénom sur les dates identiques (ou bien ajoute un index numérique en auto incrément pour gérér plus facilement la jointure).
 
|date | sfID | Prénom |
 
je manque de temps pour tester et creuser un peu.
 


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°240784
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 17:11:19  profilanswer
 

Sh@rdar a écrit a écrit :

et en faisant une jointure de la table sur elle même ??
 
tu récupère la date max regroupée par sfID
 
| date | sfID |
 
tu jointe la valeur du prénom sur les dates identiques (ou bien ajoute un index numérique en auto incrément pour gérér plus facilement la jointure).
 
|date | sfID | Prénom |
 
je manque de temps pour tester et creuser un peu.
 
 




 
Comment qu'on fait une jointure?

n°240785
Fred999
Rabat-joie
Posté le 06-11-2002 à 17:12:44  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
Comment qu'on fait une jointure?
 




 
Houla spagagné :D

n°240787
Sh@rdar
Ex-PhPéteur
Posté le 06-11-2002 à 17:14:22  profilanswer
 

SELECT  
A.champ1,
A.champ2,
B.champ3
FROM latable AS A
LEFT JOIN latable AS B
ON A.champ1 = B.champ2
WHERE ET ORDER ET LIMIT


Message édité par Sh@rdar le 06-11-2002 à 17:14:51

---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°240789
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 17:17:53  profilanswer
 

Fred999 a écrit a écrit :

 
 
Houla spagagné :D




 
mais rohhh   :o  

n°240790
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 17:18:30  profilanswer
 

Sh@rdar a écrit a écrit :

SELECT  
A.champ1,
A.champ2,
B.champ3
FROM latable AS A
LEFT JOIN latable AS B
ON A.champ1 = B.champ2
WHERE ET ORDER ET LIMIT




Merci on va tester ca
 

n°240792
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 17:25:36  profilanswer
 

Sh@rdar a écrit a écrit :

SELECT  
A.champ1,
A.champ2,
B.champ3
FROM latable AS A
LEFT JOIN latable AS B
ON A.champ1 = B.champ2
WHERE ET ORDER ET LIMIT




 
Comprends pas trop pq tu met A. A. B. devant les champs... ?

n°240795
Fred999
Rabat-joie
Posté le 06-11-2002 à 17:33:05  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
Comprends pas trop pq tu met A. A. B. devant les champs... ?




 
Chaque table a un ALIAS, et, devant chaque champ, tu indiques l'alias, pour qu'il sache dans quelle table aller chercher le champ.
 
Indispensable si deux tables ont le même champ (typiquement : une clé étrangère) ;)

n°240801
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 17:40:31  profilanswer
 

Fred999 a écrit a écrit :

 
 
Chaque table a un ALIAS, et, devant chaque champ, tu indiques l'alias, pour qu'il sache dans quelle table aller chercher le champ.
 
Indispensable si deux tables ont le même champ (typiquement : une clé étrangère) ;)



^
 
Mais la j'ai qu'une seule table,
 
j'arrive pas a appliquer ca avec ma requete
 
SELECT MAX(DateAndTime) AS DD, Username, sfID FROM gbb_Posts AS A LEFT JOIN gbb_Posts AS B ON A.DD=B.DD
 
 
c surement du nimporte nawak ce ke jai fait, mais je capte pas trop ce ke ca fait tout ce kil a dit :/
 
Column: 'DateAndTime' in field list is ambiguous
 
 

n°240803
Fred999
Rabat-joie
Posté le 06-11-2002 à 17:44:12  profilanswer
 

Pas forcément, mais justement, quand tu fais une jointure d'une table sur elle-même, il FAUT que tu précises sur laquelle des deux "tables" tu vas chercher les champs ;)
 
Sachant qu'il faut appliquer des restrictions sur une des deux tables...
 
Bon là j'y vais, mais j'essaierai de me pencher là-dessus ;)

n°240806
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 17:48:23  profilanswer
 

Fred999 a écrit a écrit :

Pas forcément, mais justement, quand tu fais une jointure d'une table sur elle-même, il FAUT que tu précises sur laquelle des deux "tables" tu vas chercher les champs ;)
 
Sachant qu'il faut appliquer des restrictions sur une des deux tables...
 
Bon là j'y vais, mais j'essaierai de me pencher là-dessus ;)




 
Ok, mais la j'y arrive pas, j'ai le cerveau en bouillie avec tout ca, si une ame charitable pouvais me corriger ma requete :/  
 

n°240828
Sh@rdar
Ex-PhPéteur
Posté le 06-11-2002 à 18:19:41  profilanswer
 

essayes
 
SELECT
A.sfID,
MAX(A.dateandtime),
B.username
FROM matable AS A
LEFT JOIN matable AS B ON A.dateandtime = B.dateandtime
GROUP BY A.sfID,A.username


Message édité par Sh@rdar le 06-11-2002 à 18:20:10

---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°240836
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 18:27:09  profilanswer
 

Sh@rdar a écrit a écrit :

essayes
 
SELECT
A.sfID,
MAX(A.dateandtime),
B.username
FROM matable AS A
LEFT JOIN matable AS B ON A.dateandtime = B.dateandtime
GROUP BY A.sfID,A.username




J'ai fais ca mais il me sort toujours plusieur fois le meme sfID
 
et ca peut pas y a qu'un seul dernier message posté par sfID

n°240837
Sh@rdar
Ex-PhPéteur
Posté le 06-11-2002 à 18:33:02  profilanswer
 

merde me suis gouré de requête à modifier...
 
 
SELECT MAX(A.DateAndTime) AS DateTimeLastMsg,
A.sfID,
B.Prenom
FROM gbb_Posts AS A
LEFT JOIN gbb_Posts AS B ON A.DateTimeLastMsg = B.DateAndTime
GROUP BY sfID


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°240841
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 18:40:40  profilanswer
 

Sh@rdar a écrit a écrit :

merde me suis gouré de requête à modifier...
 
 
SELECT MAX(A.DateAndTime) AS DateTimeLastMsg,
A.sfID,
B.Prenom
FROM gbb_Posts AS A
LEFT JOIN gbb_Posts AS B ON A.DateTimeLastMsg = B.DateAndTime
GROUP BY sfID




 
Erreur
 
requête SQL :  
 
SELECT MAX( A.DateAndTime ) AS DateTimeLastMsg, A.sfID, B.Username
FROM gbb_Posts AS A
LEFT JOIN gbb_Posts AS B ON A.DateTimeLastMsg = B.DateAndTime
GROUP BY sfID  
 
MySQL a répondu:
 
 
Unknown column 'A.DateTimeLastMsg' in 'on clause'
 
 
:/

n°240843
charlene
Verba volant, scripta manent
Posté le 06-11-2002 à 18:43:19  profilanswer
 

schtroumpheur a écrit a écrit :

 
 
Erreur
 
requête SQL :  
 
SELECT MAX( A.DateAndTime ) AS DateTimeLastMsg, A.sfID, B.Username
FROM gbb_Posts AS A
LEFT JOIN gbb_Posts AS B ON A.DateTimeLastMsg = B.DateAndTime
GROUP BY sfID  
 
MySQL a répondu:
 
 
Unknown column 'A.DateTimeLastMsg' in 'on clause'
 
 
:/



Remplace par A.DateAndTime
tu peux pas mettre le nom de l'alias, faut mettre celui de la colonne

n°240849
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 18:49:07  profilanswer
 

charlene a écrit a écrit :

Remplace par A.DateAndTime
tu peux pas mettre le nom de l'alias, faut mettre celui de la colonne




J'ai fais comme tu as dit :
 
SELECT MAX( A.DateAndTime ) AS DateTimeLastMsg, A.sfID, B.Username  
FROM gbb_Posts AS A  
LEFT JOIN gbb_Posts AS B ON A.DateAndTime = B.DateAndTime  
GROUP BY sfID  
 
 
 
et ca me fait le meme bug qui etait la cause de ce post !!!  
 
Retour a la case de part :/
 
 
ouinnn j'y arrivera jamais   :(  :sweat:

n°240852
sielfried
Posté le 06-11-2002 à 19:18:47  profilanswer
 

Faut faire deux requêtes, tout connement. Et si tu veux différencier deux posts écrits à la même seconde, il suffit d'utiliser un identifiant par post. Ca reviendra à max(idpost) au lieu de max(dateandtime).


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°240877
omega2
Posté le 06-11-2002 à 20:27:48  profilanswer
 

Essayes :
 
SELECT MAX( A.DateAndTime ) AS DateTimeLastMsg, A.sfID, B.Username  
FROM gbb_Posts AS A  
LEFT JOIN gbb_Posts AS B ON A.DateAndTime = B.DateAndTime and A.sfID = B.sfID  
GROUP BY sfID    
 
 
pour voir ce que ca donne.
 
Si ca marche pas, il te restera la solution de deux requêtes.

n°240878
Schtroumph​eur
bwwwwwaaaaarkkkkkkk!!!!!!
Posté le 06-11-2002 à 20:33:52  profilanswer
 

omega2 a écrit a écrit :

Essayes :
 
SELECT MAX( A.DateAndTime ) AS DateTimeLastMsg, A.sfID, B.Username  
FROM gbb_Posts AS A  
LEFT JOIN gbb_Posts AS B ON A.DateAndTime = B.DateAndTime and A.sfID = B.sfID  
GROUP BY sfID    
 
 
pour voir ce que ca donne.
 
Si ca marche pas, il te restera la solution de deux requêtes.




 
Pareil :/
 
je crois que je v faire 2 requete, tant pis :/
 
Merci a tous

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [Php/MySQL] - SELECT MAX(.. et GROUP BY, ca va pas :( [RESOLU!!!]

 

Sujets relatifs
[PHP MYSQL] Incrémenter un compteur[PHP // MySQL] Récup du résultat d'une requete sous forme d'array
[MySQL] Ca existe ce genre de commande ? :"Cannot send session cache limiter - headers already sent" [Resolu]
[mysql] comment changer le type d'une table ?Impression d'une image issue d'un script PHP
Pb update mysql[PHP] decalage d'id
Plus de sujets relatifs à : [Php/MySQL] - SELECT MAX(.. et GROUP BY, ca va pas :( [RESOLU!!!]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR