Probieren Sie es aus:
select *from messages mwhere notexists (select 1from messages mmwhere (mm.fromuser =m.fromuser oder mm.fromuser =m.touser) AND (mm.touser =m.touser oder mm.touser =m.fromuser) und mm.timestamp>
m.timestamp) und m.fromuser ='user1' oder m.touser ='user1';
In Zukunft wäre es wahrscheinlich besser, Konversationen zwischen zwei Benutzern als eine bestimmte Konversation zu kennzeichnen, dann gehört jede Nachricht zu einer Konversation, und somit wird es viel einfacher, Konversationen zu finden, an denen der Benutzer beteiligt ist, und Informationen zu Nachrichten, die sich darauf beziehen Gespräch. Wie auch immer.
Versuchen Sie es stattdessen mit diesem. Ähm.
select m.*
from messages m
left join messages m2
on ((m.fromuser = m2.fromuser and m.touser = m2.touser)
or (m.fromuser = m2.touser and m.touser = m2.fromuser))
and m.timestamp < m2.timestamp
where (m.fromuser = 'user1' or m.touser = 'user1')
and m2.id is null;
Es ist wahrscheinlich besser als not exists
Version, auch wenn ich es schaffe, diese zu reparieren.
diese Geige funktioniert tatsächlich