2011-08-30 1 views
0

J'ai En supposant table avec le schéma suivant:utilisateur rotatif stats

int pitchId, int pitcherId, int pitchType, timestamp pitchTimeStamp 

où nous gardons une trace de chaque pas un lanceur a planté. Maintenant, disons, je veux seulement inclure les 100 derniers emplacements et purger autre chose que les 100 derniers emplacements pour chaque pitcherId. Je sais qu'une solution possible est de parcourir chaque pitcherId en PHP et de trouver le 100th pitchId dans le passé pour ce pitcherId et de supprimer tout ce qui est plus ancien que cela. Cependant, je suppose qu'il doit y avoir un moyen plus efficace de le faire, soit par des procédures stockées ou dans mon esprit, de préférence des déclencheurs.

Merci!

Répondre

1

Vous pouvez simplement utiliser une instruction SQL comme celle-ci.

DELETE FROM pitch p 
WHERE NOT (p.pitchid IN 
      (SELECT p2.pitchid FROM pitchid p2 ORDER BY p2.pitchid DESC LIMIT 100)) 
+0

semble bon! Je ne peux même pas croire que je n'ai pas pensé à une sous-sélection, mais je vais laisser cette question sans réponse pour voir si d'autres personnes ont d'autres suggestions. – ajacian81

+1

Est-ce que cela ne supprimera pas TOUS les emplacements mais 100 pour _all pitchers_, plutôt que tous les 100 pour _each_ lanceur? –

+0

effectivement oui, mais je suppose que je pourrais joindre p et p2 sur p.pitcherId = p2.pitcherId. – ajacian81