2009-08-24 6 views
1

j'ai pris une table comme celui-ciMySQL ont besoin d'aide .. Comment puis-je filtrer max (date)

[tableau a]
UID | UNAME
------------------
001 | a
002 | b
003 | c

[table b]
UID | LOGS
----------------------
001 | 2009/08/01
001 | 2009/08/03
003 | 2009/08/02

et je veux avoir une requête comme celle-ci
UID | LASTLOG
--------------------
001 | 2009/08/03
002 |
003 | 2009/08/02

ce résultat, je l'ai déjà fait, mais j'ai fait face à un problème alors que je veux ajouter un filtre lastlogin, supposé si je suis entré dans le filtre pour montrer tous les utilisateurs qui ont lastlogin avant '2009/08/03 ', je veux un résultat comme celui-ci

UID | LASTLOG
--------------------
003 | 2009/08/02

qui éliminent UID 001 car 001 a lastlogin à 2009/08/03

i utiliser la commande SQL comme ce

SELECT a.uid, max(logs.date) 
FROM user a LEFT JOIN logs ON (a.uid = logs.uid) 
where max(logs.date)<'2009/08/03' 
group by a.uid 

comment puis-je ajouter un filtre pour afficher uniquement max . (logs.date) avant 03/08/2009, parce que la ligne 3 « où max (logs.date) < 'de 03/08/2009' provoque une erreur groupe invalide par fonction grâce

Répondre

5

Essayez ceci:

SELECT a.uid, max(logs.date) 
FROM user a LEFT JOIN logs ON (a.uid = logs.uid) 
group by a.uid 
having max(logs.date)<'2009/08/03' 
+0

Y'a-t-il eu des résultats sans erreur, mais l'UID 001 avec lastlogin 2009/08/03 apparaît toujours .. avait une déclaration ne pas faire de filtrage? –

+1

Puisque vous utilisez une chaîne pour représenter la date, et pas le type de date prédéfini de MySQL, il y a peut-être un espace à la fin de la chaîne '2009/08/03'? ('2009/08/03' est techniquement supérieur à '2009/08/03') – VoteyDisciple

+0

ohmygosh .. thx, il résolu! J'ai utilisé la variable de type date mais à propos d'un délimiteur. mysql ne pas utiliser '/' mais '-' lol .. tq tous les gars =) –

3

Toute condition qui utilise une fonction de regroupement doit aller dans la clause HAVING comme ceci:

SELECT a.uid, max(logs.date) 
FROM user a LEFT JOIN logs ON (a.uid = logs.uid) 
GROUP BY a.uid 
HAVING MAX(logs.date)<'2009/08/03' 
3

Vous souhaitez utiliser la clause SQL "having":

SELECT a.uid, max(logs.date) 
FROM user a LEFT JOIN logs ON (a.uid = logs.uid) 
group by a.uid 
having max(logs.date) < '2009/08/03' 

Vous devez utiliser " avoir "au lieu de" où "tester la valeur des fonctions agrégées.

+0

ya-il élimine l'erreur, mais pourquoi UID 001 avec 2009/08/03 apparaît toujours? est-ce que les exceptions pour le type de date? –

Questions connexes