The problem is that ORDER BY and GROUP BY doesn't work well together. The order by part is run after GROUP BY. Limit is not run until after the two other parts. At least I think it is like this, don't know for sure. What I do know for sure is that it won't work as you want it to.
I think this is one of the rare occations when you can't solve it with one normal SQL question, you probably need a bunch of them. The reason is that you can use limit to get the latest result from one catid, but not to get the latest from each of the ids. Something like this would work:
select distinct catid // order by whatever you want
foreach result
{
select columns from table where catid = catid_from_above order by date desc limit 0, 1
}
Unfortunatley I can only see one other solution to this, and it is to do the same with a stored procedure. It would be a better solution, but still it would have to do multiple queries. If anyone can make it with one query (with or without subqueries) it would probably be a better solution.