2010-11-17 6 views
1

J'ai une table 'stream_update' qui stocke les mises à jour des utilisateurs dans les groupes auxquels ils sont abonnés. Le tableau présente les champs suivants:MySQL: question de regroupement

  • id (index, incrémentation automatique)
  • user_id
  • group_id
  • stream_update
  • timestamp

Fondamentalement, je suis en train d'écrire un requête qui obtient la dernière mise à jour de flux pour chaque utilisateur de chaque groupe auquel il est abonné. Donc, si un utilisateur est abonné à 3 groupes, il recevra la dernière mise à jour qu'il a écrite dans chacun de ces groupes.

J'ai essayé ce qui suit:

SELECT * FROM stream_update GROUP BY group_id, user_id 

Cela semble fonctionner, mais il obtiendrait les enregistrements les plus anciens pas le plus récent. Ajout de "ORDER BY" à cela ne fonctionne pas, car il ne commande que les enregistrements déjà récupérés.

Une idée de comment je peux écrire une requête pour cela?

Votre aide est très appréciée :)

Répondre

3
select su.user_id, su.group_id, su.stream_update, su.timestamp 
    from stream_update su 
     inner join (select user_id, group_id, max(timestamp) as maxtime 
         from stream_update 
         group by user_id, group_id) m 
      on su.user_id = m.user_id 
       and su.group_id = m.group_id 
       and su.timestamp = m.maxtime 
0

Avez-vous essayé quelque chose comme ceci:

SELECT id,user_id,group_id,max(stream_update),timestamp 
FROM stream_update 
GROUP BY group_id, user_id 
0

ce travail?

select T1.user_id, t1.group_id, t2.stream_update 
from 
    (  
    select user_id, group_id, max(timestamp) as latesttimestamp 
    from streamtable 
    group by user_id, group_id 
) as T1 

    inner join streamtable as T2 
    on T1.user_id = T2.user_id 
    and T1.group_id = T2.group_id 
    and T1.latesttimestamp = T2.timestamp 
0

Peut-être une sélection de sélection ... alors faites votre sélection régulière (ci-dessus) et comprennent l'horodatage dans la sortie

puis l'envelopper dans un

SELECT whatever-fields you want FROM (
    inner-select-statement with grouping 
) 
ORDER BY timestamp 

Quelque chose comme ça devrait vous donner ce que je pense que vous êtes après.