Reputation: 901
I know how to join with the MAX or MIN value of a column from another table, for example:
SELECT id, user_id, date_created, invite_date FROM user
INNER JOIN (
SELECT user_referral.user_id, MIN(user_referral.date_created) as invite_date
FROM user_referral
GROUP BY user_referral.user_id) AS invtable
ON user.id = invtable.user_id
But how do I do this for the nth highest or lower value of user_referral.date_created
instead of just MAX or MIN?
Upvotes: 1
Views: 885
Reputation: 1270181
Just use limit/offset
:
SELECT u.id, u.user_id, u.date_created, u.invite_date
FROM user u INNER JOIN
(SELECT ref.*
FROM user_referral ref
GROUP BY ref.user_id
ORDER BY ref.date_created
LIMIT 1 OFFSET 8
) invtable
ON u.id = invtable.user_id;
Just as a note, this returns the ninth row, because offset counting starts at 0
and not 1
.
EDIT:
Now I see. You can do it this way:
SELECT u.id, u.user_id, u.date_created, u.invite_date
FROM user u INNER JOIN
(SELECT ref.*,
(@rn := if(@uid = ref.user_id, @rn + 1,
if(@uid := ref.user_id, 1, 1)
)
) as rn
FROM user_referral ref cross join
(select @rn := 0, @uid := -1) vars
ORDER BY ref.user_id, ref.date_created
) invtable
ON u.id = invtable.user_id
WHERE rn = 8;
Upvotes: 3
Reputation: 934
You could try using a LIMIT N
statement and then doing Max or Min like so (I used 8 for this example):
SELECT id, user_id, date_created, invite_date FROM user
INNER JOIN (
SELECT user_id, MAX(user_referral.date_created) as invite_date
FROM (SELECT ref.user_id as user_id, MIN(ref.date_created) as invite_date
FROM user_referral ref
GROUP BY ref.user_id
ORDER BY ref.date_created
LIMIT 8)) AS invtable
ON user.id = invtable.user_id
Upvotes: 1