Заявката, която търсите, трябва да изглежда така:
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)
Можете да се присъедините към таблицата user
ако имате нужда от колони от тази таблица в резултата, в противен случай дори нямате нужда от нея за заявката.
Ако не ви трябва min_created_at
в SELECT
списък, можете просто да го изоставите.
Трябва да е лесно за превод на Ruby (в което не съм добър).
За да получите цялото потребителско досие (както разбирам от вашия коментар):
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
Или:
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)
С PostgreSQL 9.1+ можете просто да напишете:
GROUP BY u.id
(като в MySQL) .. предоставен id
е първичният ключ.
Цитирам бележките по изданието :