2008-12-08 8 views
3

J'ai une table utilisateur comme celui-ciSQL: obtenir Nième élément dans chaque groupe

user_id | community_id | registration_date 
-------------------------------------------- 
1  |  1  | 2008-01-01 
2  |  1  | 2008-05-01 
3  |  2  | 2008-01-28 
4  |  2  | 2008-07-22 
5  |  3  | 2008-01-11 

Pour chaque communauté, je voudrais obtenir le temps que le 3e utilisateur enregistré. Je peux facilement le faire pour une seule communauté en utilisant l'extension SQL 'limite' de MySql. Par exemple, pour la communauté avec ID = 2

select registration_date 
from user 
order by registration_date 
where community_id = 2 
limit 2, 1 

Sinon, je peux obtenir la date à laquelle le premier utilisateur enregistré pour toutes les communautés via:

select community_id, min(registration_date) 
from user 
group by 1 

Mais je ne peux pas comprendre comment obtenir la date d'enregistrement du 3ème utilisateur pour toutes les communautés dans une instruction SQL unique.

Cheers, Don

Répondre

2

Avec une intérieure sélection:

select 
    registration_date, community_id 
from 
    user outer 
where 
    user_id IN (
    select 
     user_id 
    from 
     user inner 
    where 
     inner.community_id = outer.community_id 
    order by 
     registration_date 
    limit 2,1 
) 
order by registration_date 

Sélectionne l'ensemble des utilisateurs, où chaque utilisateur est le 3ème utilisateur dans leur communauté retournée par la clause de limite dans la sélection intérieure.

+1

Cela ne fonctionne pas car la sélection interne peut renvoyer plusieurs valeurs. La version de MySql que j'utilise ne permet pas d'utiliser LIMIT dans un select interne, donc je ne peux pas simplement remplacer le "=" par un "IN" –

+0

Ah, oui, les anciennes versions de MySQL peuvent être un douleur à travailler avec. Je ne suis pas sûr de ce que vous pouvez faire si vous ne pouvez pas limiter la sélection interne. –

+0

Vous devez probablement le diviser en plusieurs instructions en raison des limitations de votre version. –

0

Est-ce ce que vous voulez dire?

SELECT registration_date 
FROM user 
ORDER BY registration_date 
LIMIT n 

n est l'utilisateur que vous êtes préoccupé par.

+0

Non, je veux obtenir la date d'enregistrement Nième utilisateur pour chaque communauté –

Questions connexes