Trier des contact par la date la plus haute du dernier message envoyer

78320
,

Bonjour, pour faire simple j'ai une table users qui comptiens tous les utilisateurs, une table friends_relationships qui permettent de savoir quel utilisateur est ami avec qui et enfin une table messages qui comptiens les messages entre les utilisateurs.

Bons en gros j'aimerais afficher une liste avec les utilisateurs qui sont amis avec moi, afficher le dernier message envoyer et les trier par la date des derniers messages envoyer

https://image.noelshack.com/fichiers/2018/34/5/1535074320-users.png

Donc j'arrive à afficher les utilisateurs amis et le dernier message envoyer.
Maintenant si j'ai plus 1 utilisateur le problème est que le premier de la liste ne sera pas forcément le dernier message envoyer.

J'ai essayé pas mal de choses comme de grouper les utilisateurs d'un même ID et de récupéré la valeur date la plus haute avec un MAX() mais sans succès.

J'espère que vous pourriez m'aider.

2 Réponse

27754
,

Salut
pourquoi tu fais pas un order by date limit 1 ???

78320
,

En fait j'ai besoin d'en récupérer plusieurs, voici ma requête si ça peut aider.

Avec cette requête j'obtiens juste les derniers messages de l'autre utilisateur même si j'ai envoyé un message, sa trie bien par la date mais le message ne correspond pas à la date c'est bizarre je ne comprends rien.

$sql = "
      SELECT
          friends_relationships.accept,
          users.id,
          users.first_name,
          users.online,
          messages.user_id1,
          messages.user_id2,
          messages.content,
          MAX(messages.created_at) as created_at
      FROM friends_relationships
      LEFT JOIN users
      ON friends_relationships.user_id2 = users.id OR friends_relationships.user_id1 = users.id
      LEFT JOIN messages
      ON friends_relationships.user_id1 = messages.user_id1 OR friends_relationships.user_id2 = messages.user_id2 OR friends_relationships.user_id2 = messages.user_id1 OR friends_relationships.user_id2 = messages.user_id1
      WHERE (friends_relationships.user_id1 = :user OR friends_relationships.user_id2 = :user)
      AND (messages.user_id1 = :user OR messages.user_id2 = :user)
      AND users.active = '1'
      AND friends_relationships.accept = '1'
      AND users.id != :user
      AND messages.user_id1 != :user
      GROUP BY messages.user_id1
      ORDER BY MAX(messages.created_at) DESC
";
$q = $db->prepare($sql);
$q->execute([
    'user' => get_session('user_id')
]);

ça retourne :

Array
(
    [0] => stdClass Object
        (
            [accept] => 1
            [id] => 2
            [first_name] => Enora
            [online] => 2018-08-24 15:02:16
            [user_id1] => 2
            [user_id2] => 1
            [content] => Salut toi :)
            [created_at] => 2018-08-24 15:01:52
        )

    [1] => stdClass Object
        (
            [accept] => 1
            [id] => 3
            [first_name] => Jean
            [online] => 2018-08-24 15:17:01
            [user_id1] => 3
            [user_id2] => 1
            [content] => Salut :)
            [created_at] => 2018-08-24 03:18:29
        )

)

Et voilà ma base de données :
https://image.noelshack.com/fichiers/2018/34/5/1535116784-bdd.png

Dans l'exemple je suis l'ID 1 et les 2 autres ID sont amis avec moi si on regarde les derniers messages envoyer et le résultat du content et created_at ça ne correspondent pas.