In MySQL, I have a myTab1
which has columns like userId
, name
, gender
, birthMonth
. Here userId
is the primary key.
There can be only 1 unique userId
in the entire table.
I have another table myTab2
which has columns like userId
, level
, score
.
There is no primary key in this table and it is just for the transactions.
Example:
myTab1
userId | name | gender | birthMonth |
---|---|---|---|
abc | name1 | Male | January |
xyz | name2 | Female | March |
mno | name3 | Male | July |
myTab2
userId | level | score |
---|---|---|
abc | 1 | 10 |
abc | 2 | 9 |
abc | 3 | 11 |
abc | 4 | 10 |
abc | 5 | 23 |
xyz | 1 | 11 |
xyz | 2 | 10 |
mno | 1 | 8 |
Now I need only the top 3 users with the highest level along with their name which is in myTab1 as below
userId | name | level | score |
---|---|---|---|
abc | name1 | 5 | 23 |
xyz | name2 | 2 | 10 |
mno | name3 | 1 | 8 |
Following is what I wrote but not sure how to get the result like above. I am not good at DB queries and looking for some help.
SELECT
b.*,
a.name
FROM
myTab1 AS b
INNER JOIN myTab2 as a ON b.userId=a.userId
ORDER BY level DESC
limit 3
You can try this...
SELECT
t1.userId,
t1.name,
MAX(t2.level) AS level,
MAX(t2.score) AS score
FROM
myTab1 t1
JOIN
myTab2 t2 ON t1.userId = t2.userId
GROUP BY
t1.userId, t1.name
ORDER BY
level DESC
LIMIT 3;
Output