¿como que la segunda y tercera no ordenan por fecha?
Lo que tu buscas es obtener el último de cada usuario. El ultimo lo obtienes con la función max(fecha) que te devuelve la fecha mas alta. Por tanto si haces una select que devuelva el max del usuario X te devuelve el último del usuario X. Si aplicas eso a todos ya tienes una select que te devuelve el ultimo de cada uno.
Creo que esto funcionará y si no será algo parecido. Mucha gente tiene problemas con el having.
La idea básica es que en una select primero seleccionas registros. Luego puede ir una claúsula where que EXCLUYE registros de la selección. De lo que queda hay una claúsula group que agrupa los datos obtenidos y realiza el cálculo correspondiente si lo hay y por último la claúsula having que EXCLUYE de estos resultados lo que no cumpla la condición del having. Despues de todo esto tienes la posibilidad de ORDENAR con un order by.
En el caso presente pongo un alias C a la tabla comentarios y hago una select de todos los usuarios. Al agrupar por usuario me quedará cada usuario con todos sus comentarios. En el having excluyo de cada grupo aquellos que no cumplan la condición de que la fecha tiene que ser la mayor. De esta forma solo quedsrá uno de cada grupo con la fecha mayor en cada caso. Es poco ortodoxo porque he utilizado una alias para poder subpreguntar a una tabla sobre si misma, pero creo que funcionará.