La requête que vous recherchez devrait ressembler à celle-ci :
SELECT user_id, min(created_at) AS min_created_at
FROM cards
WHERE company_id = 1
GROUP BY user_id
ORDER BY min(created_at)
Vous pouvez joindre dans la table user
si vous avez besoin des colonnes de cette table dans le résultat, sinon vous n'en avez même pas besoin pour la requête.
Si vous n'avez pas besoin de min_created_at
dans le SELECT
liste, vous pouvez simplement la laisser de côté.
Ça devrait être facile à traduire en Ruby (pour lequel je ne suis pas doué).
Pour obtenir l'enregistrement complet de l'utilisateur (comme je le déduis de votre commentaire):
SELECT u.*,
FROM user u
JOIN (
SELECT user_id, min(created_at) AS min_created_at
FROM cards
WHERE company_id = 1
GROUP BY user_id
) c ON u.id = c.user_id
ORDER BY min_created_at
Ou :
SELECT u.*
FROM user u
JOIN cards c ON u.id = c.user_id
WHERE c.company_id = 1
GROUP BY u.id, u.col1, u.col2, .. -- You have to spell out all columns!
ORDER BY min(c.created_at)
Avec PostgreSQL 9.1+, vous pouvez simplement écrire :
GROUP BY u.id
(comme dans MySQL) .. fourni id
est la clé primaire.
Je cite les notes de version :