2010-02-11 3 views
3

Je suis en train d'écrire une fonction SQL pour faire quelque chose comme:quelque chose de similaire à MAX dans un mysql sql clause where

SELECT 
    person.id, 
    person.phonenumber 
FROM 
    person INNER JOIN activity ON person.id = activity.personid 
WHERE 
    MAX(activity.activitydate) < DATE_SUB(CURDATE(), INTERAVAL 180 DAY); 

Chaque fois qu'une personne est en contact, nous créons un record d'activité pour les notes etc. Je cherche donc toutes les personnes qui n'ont pas été contactées au cours des 180 derniers jours. Évidemment, cela ne fonctionne pas, car max ne peut pas être utilisé dans la clause where. J'ai vu this, mais mysql n'a pas l'instruction with.

De plus, j'ai essayé

SELECT 
    person.id, 
    person.phonenumber, 
    MAX(activity.activitydate) as ndate 
FROM 
    person INNER JOIN activity ON person.id = activity.personid 
WHERE 
    ndate < DATE_SUB(CURDATE(), INTERVAL 180 DAY) 
GROUP BY person.id; 

mais Ndate était pas connu.

Une idée de comment je ferais ça?

Répondre

8

Vous devez utiliser la clause HAVING:

SELECT p.id, 
     p.phonenumber 
    FROM PERSON p 
    JOIN ACTIVITY a ON a.personid = p.id 
GROUP BY p.id, p.phonenumber 
    HAVING MAX(a.activitydate) < DATE_SUB(CURDATE(), INTERVAL 180 DAY) 

... ce qui signifie définir une clause GROUP BY.

+0

@OMG Poneys: Merci :) –

0

Vous pouvez utiliser une clause ayant pour cela:

SELECT 
person.id, 
person.phonenumber, 
MAX(activity.activitydate) as ndate 
FROM 
person INNER JOIN activity ON person.id = activity.personid 
GROUP BY person.id 
HAVING MAX(activity.activitydate) < DATE_SUB(CURDATE(), INTERVAL 180 DAY) 
0

En fonction de la taille de votre ensemble de données/indexation, vous pourriez aussi chercher à utiliser « TOP 1 » avec une ORDER BY vs « MAX ». TOP 1 est parfois plus rapide aux dates.

+1

J'étais en train d'avoir cette conversation avec quelqu'un hier, mais son problème est qu'il veut un ensemble de valeurs 'MAX()' par utilisateur, pas par requête, par exemple. 'SELECT MAX (activité.activitydate)'. Sa requête originale est seulement hypothétique, et non valide. –

+1

'TOP 1' est la syntaxe SQL Server - pour MySQL, le synonyme serait' LIMIT 1'. –

+0

Bonne prise OMG Ponies – jasonk

Questions connexes