2008-11-24 5 views
1

Voici une version simplifiée de mon scénario:Interrogation pour les enregistrements N associés à chaque enregistrement référencé par l'ensemble des clés d'enregistrement

  • J'ai une table nommée projet que je référence via un champ « id ».
  • J'ai une table nommée Photo qui a un champ nommé 'project_id' que j'utilise pour relier plusieurs photos à un seul projet. La table Photo possède également un champ 'id' auto-incrémenté que j'utilise pour la commande, entre autres choses.

Voici ce que je veux accomplir: Pour une collection de valeurs id projet, je souhaite récupérer les 5 dernières ont ajouté des photos à chaque projet - idéalement dans une seule requête, bien sûr. :-)

En d'autres termes, au lieu d'imposer une seule limite de requête, j'aimerais idéalement spécifier une limite par projet sur le nombre de photos retournées.

Je suis actuellement en train de l'implémenter comme une requête par projet, donc N projets = N requêtes (une bonne stratégie de mise en cache va certainement réduire le mal, mais cela viendra plus tard).

Quelqu'un at-il une solution?

Merci.

Répondre

1

Pour le problème des "derniers éléments" dans MySQL, regardez ici: How to select maximum 3 items per users in MySQL? (c'est dans la bonne réponse).

Lorsque vous le prenez à partir de là, tout ce qui vous manque est un JOIN avec votre table Projects, ce qui devrait être facile à faire.

0
SELECT project.*, photo.* 
    FROM photo 
    LEFT JOIN project USING project_id 
WHERE photo.project_id = '{$id}' 
ORDER BY photo_id DESC 
LIMIT project.project_photos_limit 

Essayez-vous? (Avec vos fieldnames, évidemment)

0

Une légère altération de la solution de philistyne:

SELECT project.*, photo.* 
    FROM photo 
    LEFT JOIN project USING(project_id) 
WHERE photo.project_id IN (comma separated list of project ids) 
ORDER BY photo_id DESC 
LIMIT project.project_photos_limit 

Bien que je ne suis pas sûr si LIMIT vous permettra d'utiliser un champ pour le faire.

Questions connexes