Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zeilen zählen ohne Unterschied

Ich bin ein wenig verwirrt, weil Ihre Logik den frühesten zu bringen scheint Nachricht nicht die neueste.

Obwohl distinct on ist ziemlich mächtig, ich bin mir nicht sicher, ob Sie leicht bekommen können, was Sie wollen. Meine Neigung ist es, auf die Verwendung von Fensterfunktionen umzusteigen:

SELECT m.*
FROM (SELECT m.*,
             (CASE WHEN sender_id < recipient_id
                   THEN (sender_id, recipient_id)
                   ELSE (recipient_id, sender_id)
              END) AS pair,
             ROW_NUMBER() OVER (PARTITION BY (CASE WHEN sender_id < recipient_id
                                                   THEN (sender_id, recipient_id)
                                                   ELSE (recipient_id, sender_id)
                                              END)
                                ORDER BY created_at, unread_count DESC
                               ) as seqnum,
             SUM(CASE WHEN m.opened = false THEN 0 ELSE 1 END) OVER
                 (PARTITION BY (CASE WHEN sender_id < recipient_id
                                     THEN (sender_id, recipient_id)
                                     ELSE (recipient_id, sender_id)
                                END)
                 ) as NumUnopened
      FROM "messages" m
      WHERE ((recipient_id = 6 and recipient_delete = false) or 
             (sender_id = 6 and sender_delete = false))  
     ) t
WHERE seqnum = 1;