A coisa do ID ainda funcionaria teoricamente, desde que os IDs nunca mudem ...
Eu recomendaria usar um campo timestamp na estrutura da tabela chamado "date" e usar o "CURRENT_TIMESTAMP" como valor padrão, isso preencherá automaticamente a data/hora no registro ao inserir ...
Ordene por este campo DESC, limite x
Além disso, experimentei muitos casos de dados errados aparecendo graças ao agrupamento... Certifique-se de que seus dados estejam corretos antes de aplicar ORDER BY e LIMIT
Para obter postagens de user1 para user1, não há necessidade de agrupar por:
SELECT * FROM posts
WHERE toID=fromID
ORDER BY date DESC LIMIT 3
Para obter postagens de * para user1:
SELECT * FROM posts
WHERE toID="USER1_ID"
ORDER BY date DESC LIMIT 3
Para obter postagens de * para user1, apenas usuários únicos:
SELECT * FROM posts
WHERE toID="USER1_ID"
GROUP BY FromID
ORDER BY date DESC LIMIT 3
Às vezes você vai se deparar com o problema em que os registros GROUPED não são ordenados por ORDER BY, porque o ORDER BY é aplicado ao resultado APÓS o agrupamento ser aplicado... Para obter uma solução alternativa:
SELECT * FROM (
SELECT * FROM posts
WHERE toID="USER1_ID"
ORDER BY date DESC
) as `derived` GROUP BY FromID LIMIT 3
Para obter os últimos 3 usuários que enviaram uma postagem mais recentemente:
SELECT * FROM (
SELECT * FROM posts
WHERE toID=fromID
ORDER BY date DESC
) as `derived` GROUP BY FromID LIMIT 3