We can't help that much, based on that limited information.
But I think you need to look at exactly what you are trying to return, and change teh way you are doing queries.
The first thing to do is to stop issuing wildcard selects:
SELECT * FROM MyTable ...
Partly because it is inefficient in that you may not in future want all the columns (what happens if you add an "Image" column - the return size grows enormously), and partly because it helps you to focus on what you are trying to achieve.
When you say:
SELECT * FROM advisor_ranks GROUP BY userid, rankno, achievedate
It is the equivelant of saying:
SELECT userid, rankno, achievedate FROM advisor_ranks GROUP BY userid, rankno, achievedate
Which is exactly the same as saying:
SELECT userid, rankno, achievedate FROM advisor_ranks
because it returns the same rows, given that the GROUP BY clause specifies which rows mush be identical in order to group them together. Since you specify all your rows in the GROUP BY clause and no two rows can ever be identical, it is redundant.
In order to use GROUP BY and return a single row for each userid is simple to start with:
SELECT userid FROM advisor_ranks GROUP BY userid
But you have probably noticed that SQL Complains if you try to return any further columns because they are "not aggregate functions or included in the GROUP BY statement" - which is SQL talk for "I don't know how to combine the different values". Think about it: if you have two rows for userid 6:
userid rankno achieveddate
6 4 2013-01-01
6 3 2013-03-17
Then which data did you want? Which rank? Which date? SQL can't combine them for you, so you have to specify it:
SELECT userid, SUM(rankno), MAX(achievedate) FROM advisor_ranks GROUP BY userid
Will work - but only you can decide what you actually need to return.