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

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

Marsh Posté le 06-11-2002 à 16:00:42    

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
Reply

Marsh Posté le 06-11-2002 à 16:00:42   

Reply

Marsh Posté le 06-11-2002 à 16:03:59    

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
Reply

Marsh Posté le 06-11-2002 à 16:04:05    

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 :(

Reply

Marsh Posté le 06-11-2002 à 16:04:38    

Tu peux nous montrer un exmeple qui marche pas

Reply

Marsh Posté le 06-11-2002 à 16:05:05    

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??

Reply

Marsh Posté le 06-11-2002 à 16:05:26    

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)

Reply

Marsh Posté le 06-11-2002 à 16:05:44    

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 ...

Reply

Marsh Posté le 06-11-2002 à 16:07:08    

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

Reply

Marsh Posté le 06-11-2002 à 16:15:50    

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
Reply

Marsh Posté le 06-11-2002 à 16:18:05    

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

Reply

Marsh Posté le 06-11-2002 à 16:18:05   

Reply

Marsh Posté le 06-11-2002 à 16:20:58    

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


 
Essaie ça [:spamafote]

Reply

Marsh Posté le 06-11-2002 à 16:26:52    

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 :/

Reply

Marsh Posté le 06-11-2002 à 16:30:23    

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?

Reply

Marsh Posté le 06-11-2002 à 16:32:28    

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
Reply

Marsh Posté le 06-11-2002 à 16:36:47    

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é.

Reply

Marsh Posté le 06-11-2002 à 16:40:31    

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?

Reply

Marsh Posté le 06-11-2002 à 16:44:07    

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]

Reply

Marsh Posté le 06-11-2002 à 16:44:46    

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

Reply

Marsh Posté le 06-11-2002 à 16:50:25    

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...

Reply

Marsh Posté le 06-11-2002 à 17:03:00    

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.

Reply

Marsh Posté le 06-11-2002 à 17:07:43    

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
Reply

Marsh Posté le 06-11-2002 à 17:11:19    

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?

Reply

Marsh Posté le 06-11-2002 à 17:12:44    

schtroumpheur a écrit a écrit :

 
 
Comment qu'on fait une jointure?
 




 
Houla spagagné :D

Reply

Marsh Posté le 06-11-2002 à 17:14:22    

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
Reply

Marsh Posté le 06-11-2002 à 17:17:53    

Fred999 a écrit a écrit :

 
 
Houla spagagné :D




 
mais rohhh   :o  

Reply

Marsh Posté le 06-11-2002 à 17:18:30    

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
 

Reply

Marsh Posté le 06-11-2002 à 17:25:36    

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... ?

Reply

Marsh Posté le 06-11-2002 à 17:33:05    

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) ;)

Reply

Marsh Posté le 06-11-2002 à 17:40:31    

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
 
 

Reply

Marsh Posté le 06-11-2002 à 17:44:12    

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 ;)

Reply

Marsh Posté le 06-11-2002 à 17:48:23    

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 :/  
 

Reply

Marsh Posté le 06-11-2002 à 18:19:41    

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
Reply

Marsh Posté le 06-11-2002 à 18:27:09    

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

Reply

Marsh Posté le 06-11-2002 à 18:33:02    

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
Reply

Marsh Posté le 06-11-2002 à 18:40:40    

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'
 
 
:/

Reply

Marsh Posté le 06-11-2002 à 18:43:19    

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

Reply

Marsh Posté le 06-11-2002 à 18:49:07    

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:

Reply

Marsh Posté le 06-11-2002 à 19:18:47    

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
Reply

Marsh Posté le 06-11-2002 à 20:27:48    

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.

Reply

Marsh Posté le 06-11-2002 à 20:33:52    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed