2016-07-30 5 views
1

Ich arbeite an einem Chat-System und müssen die Posteingang Daten für Benutzer 1119 abrufen. Diese Abfrage sollte die letzte Nachricht aus jeder Konversation zurückgeben.SQL & LINQ - Distinct von 2 Spalten und "umgekehrte Werte"

Eine Nachricht Einheit besteht aus einer Sender-ID (CreateUserId), Empfänger-ID (Benutzer-ID), Datum (ErstellDat) und den Nachrichtentext (Desc)

EDIT: Ein "Gespräch" ist eine Gruppe von Nachrichten gesendet zwischen zwei Benutzer. Wenn die Benutzer beispielsweise 1119 und 1120 sind, sind die Nachrichten in der Konversation diejenigen mit CreateUserId = 1119, UserId = 1120 ODER CreateUserId = 1120, UserId = 1119.

Die aktuelle Abfrage sieht wie folgt aus:

SELECT MAX(Id) Id, CreateUserId Sender, 
    UserId Receiver, MAX(CreateDate) Date, MAX([Desc]) Message 

    FROM [CarSharing].[dbo].[Message] 
    WHERE CreateUserId = 1119 OR UserId = 1119 
    GROUP BY CreateUserId, UserId) 

THE ISSUE: The result gives out two messages from the same person, as the sender and receiver ids are switched. The row with the id 124 shouldn't be there

Letztlich würde Ich mag diese mit LINQ implementieren, so Lösungen, die auch sehr willkommen!

+0

Bearbeiten Sie Ihre Frage mit Beispieldaten und gewünschten Ergebnissen. Was ist eine Unterhaltung? –

Antwort

0

Ich gehe davon aus, dass eine "Konversation" einfach eine Nachricht zwischen zwei bestimmten Personen ist. Das scheint deine Anfrage zu approximieren.

Sie können nicht wirklich tun, was Sie mit Aggregation wollen. Weil das "Maximum" der Nachrichtenspalten möglicherweise nicht das maximale Datum/die maximale Zeit ist. Verwenden Sie stattdessen Fensterfunktionen:

SELECT m.* 
FROM (SELECT m.*, 
      ROW_NUMBER() OVER (ORDER BY CreateDate DESC, id DESC) as seqnum 
     FROM [CarSharing].[dbo].[Message] m 
     WHERE 1119 IN (m.CreateUserId, UserId) 
    ) m 
WHERE seqnum = 1; 

Die ORDER BY in der Windowing-Klausel jedoch sollten Sie die Reihenfolge festlegen. Dies ist anzunehmen, dass das Erstellungsdatum zuerst und dann die ID ist.