emkay
emkay

Reputation: 901

Join to nth highest value in another table in MySQL

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

Answers (2)

Gordon Linoff
Gordon Linoff

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

Spaceman Spiff
Spaceman Spiff

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

Related Questions