2010-05-18 6 views
1

Pour la version courte de cette question, je veux accomplir quelque chose dans la ligne de ce qui est visible sur la page d'accueil Flickr. Il montre les trois dernières photos de chaque de vos amis triés par date mais groupés par ami.SQL Dernières photos de contacts (groupés par contact)

Voici une explication plus longue: Par exemple, j'ai 3 amis: John, George et Andrea. La liste que je veux extraire devrait ressembler à ceci:

George

  • photo - 2010-05-18
  • photo - 2010-05-18
  • photo - 2010-05-12

John

  • photo - 2010-05-17
  • photo - 2010-05-14
  • photo - 2010-05-12

Andrea

  • photo - 2010-05-15
  • photo - 2010-05-15
  • Photo - 2010-05-15

Ami avec la photo la plus récente importée est en haut bu t ses 2 fichiers suivants suivent.

J'aimerais faire de MySQL, et pour le moment je suis arrivé ici:

SELECT photos.user_id, photos.id, photos.date_uploaded 
FROM photos 
WHERE photos.user_id IN (SELECT user2_id 
         FROM user_relations 
         WHERE user1_id = 8) 
ORDER BY date_uploaded DESC 

user1_id = 8 est l'utilisateur actuellement connecté et user2_id sont les IDs d'amis. Cette requête retourne en effet les derniers fichiers téléchargés par les contacts de l'utilisateur avec id = 8 triés par date. Cependant, j'aimerais accomplir le groupement et la limitation mentionnés ci-dessus.

Espérons que cela a du sens. Merci d'avance.

+0

Est-ce acceptable si au lieu de trois rangées par ami vous obtenez trois colonnes par ami, chaque colonne contient une photo? –

+0

Pas vraiment. Parliez-vous de GROUP_CONCAT? – janosrusiczki

+0

Non, mais je pense qu'il est possible d'avoir une ligne comme 'userid: 1, photo1_id: 200, photo1_date: 2009-10-01, photo2_id: 167, photo2_date: 2009-08-01, photo3_id: 120, photo3_date: 2009 -06-01'. Rangées similaires pour chaque ami. –

Répondre

3

Parfois, la seule façon de acheive fin est de créer un morceau de SQL si laid et odieux, que l'alternative de faire des requêtes multiples devient attrayante :-)

Je voudrais juste une requête ne pour obtenir un liste de vos amis puis, pour chaque ami, obtenez les trois photos les plus récentes. Quelque chose comme:

friend_list = sqlexec "select user2_id from relations where user1_id = " 
         + current_user_id 
photolist = [] 
for friend in friend_list: 
    photolist += sqlexec "select user_id, id, date_uploaded from photos" 
       + " where user_id = " 
       + friend.get("user2_id") 
       + " order by date_uploaded desc fetch first 3 rows only" 

# Now do something with photolist 

Vous n'avez pas ont le faire comme une requête plus que vous êtes limité à une expression régulière pour faire correspondre un modèle odieux. Bien sûr, ce serait bien d'être "intelligent", mais c'est rarement nécessaire. Je préfère une approche pragmatique.

+1

Et puis vous triez le tableau/hachage résultant par la date de la photo du haut. – janosrusiczki

+1

+1 ... certaines choses ont juste besoin d'être formatées en code, SQL n'est pas censé être complètement général. – Donnie

Questions connexes