- SELECT MAX(.. et GROUP BY, ca va pas :( [RESOLU!!!] [Php/MySQL] - PHP - Programmation
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: |
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
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??
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 !!!
|
Je me suis trompe en effet (d ou l effacement d emon post)
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 ...
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
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
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
Marsh Posté le 06-11-2002 à 16:20:58
Code :
|
Essaie ça
Marsh Posté le 06-11-2002 à 16:26:52
Fred999 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
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?
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
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é.
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?
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
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
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 |
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...
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.
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.
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?
Marsh Posté le 06-11-2002 à 17:12:44
schtroumpheur a écrit a écrit : Comment qu'on fait une jointure? |
Houla spagagné
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
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
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... ?
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)
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
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
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
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
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
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
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'
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
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
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).
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.
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
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