2010-12-03 22 views
2

J'ai 2 tables dans MySQL, appelez compte et notez:MySQL: Obtenez les enregistrements dont la plus grande valeur dans un autre domaine est inférieure à un certain seuil

Account 
- Id 
- Available (bool) 

Note 
- Id 
- When (DateTime) 
- AccountId (FKey) 

Je voudrais mettre à jour les comptes dont la plus récente note est inférieure à un seuil (disons qu'il y a 90 jours). Dans SQL, je voudrais quelque chose comme ce qui suit (ce qui ne fonctionne évidemment pas en raison de la façon dont fonctionne max)

UPDATE 
    Account INNER JOIN Note ON Account.Id = Note.AccountId 
SET 
    Account.Available = true 
WHERE 
    Max(Note.When) < DATE_ADD(NOW(), INTERVAL -90 DAY); 

Est-ce que quelqu'un sait d'une façon de le faire?

+0

Est-ce que 'max()' est vraiment nécessaire? – Sathya

Répondre

5

Non testé, mais je pense que cela fonctionnerait.

UPDATE 
    Account 
SET 
    Account.Available = true 
WHERE 
    Id IN(
     SELECT 
      AccountId 
     FROM 
      Note 
     GROUP BY 
      AccountId 
     HAVING 
      Max(Note.When) < DATE_ADD(NOW(), INTERVAL -90 DAY) 
    ); 
+1

+1 Je ne pense pas que vous auriez même besoin d'effectuer le INNER JOIN dans votre version. –

+0

Vous avez raison, INNER JOIN n'est pas nécessaire. Copier/coller à nouveau frappe :) –

+0

Malheureusement, vous ne pouvez pas utiliser les fonctions d'agrégat dans la clause where (Max (Note.When)) –