The actual question is a little more complex than that, so here goes.
I have a website which reviews games. Ratings/reviews are posted for each game, and so I have a MySQL database to handle it all.
Thing is, I’d really like a page that showed what score (out of 10) meant what, and to illustrate it would have the game that was last reviewed as an example. I can always do it without, but this would be cooler.
So the query should return something like this (but running from 10 to 0):
|---------------*----------------*-----------------*-----------------| * game.gameName | game.gameImage | review.ourScore | review.postedOn * |---------------*----------------*-----------------*-----------------| | Top Game | img | 10 | (unix timestamp)| | NearlyTop Game| img | 9 | (unix timestamp)| | Great Game | img | 8 | (unix timestamp)| |---------------*----------------*-----------------*-----------------|
The information is in two tables, game and review. I think you’d use MAX() to find out the last timestamp and corresponding game information, but as far as complex queries go, I’m in way over my head.
Of course this could be done with 10 simple SELECTs but I’m sure there must be a way to do this in one query.
Thanks for any help.
Here is an ugly solution I found:
This query simply gets the IDs and scores of the reviews that you want to look at. I have included it so that you can understand what the trick is, without getting distracted by other stuff:
This exploits MySQL’s ‘GROUP BY’ behavior. When the grouping is done, if the source rows have different values for different columns, then the value of the topmost source row is used. So if you had rows in this order:
Then after you group by score, the reviewId is 1 because that row was on the top:
So we want to put the most recent review on the top before we do the group by. Since ORDERing is always dones after grouping, in a single SELECT statement, I had to make a subquery to accomplish this. Now we just dress up this query a little bit to get all the fields you wanted:
That should work.