Die Abfrage, nach der Sie suchen, sollte wie folgt aussehen:
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)
Sie können sich in die Tabelle user
eintragen wenn Sie Spalten dieser Tabelle im Ergebnis benötigen, sonst brauchen Sie sie nicht einmal für die Abfrage.
Wenn Sie min_created_at
nicht benötigen im SELECT
Liste, Sie können es einfach weglassen.
Sollte leicht in Ruby zu übersetzen sein (was ich nicht gut kann).
Um den gesamten Benutzerdatensatz abzurufen (wie ich Ihrem Kommentar entnehme):
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
Oder:
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)
Mit PostgreSQL 9.1+ können Sie einfach schreiben:
GROUP BY u.id
(wie in MySQL) .. bereitgestellte id
ist der Primärschlüssel.
Ich zitiere die Versionshinweise :