2017-12-18 3 views
3

i Tisch haben wie dieseZwei Säulen kombinieren

 
message_id | sender_id | recipient_id | message 
6   677   681   message 0 
7   677   678   message 1 
9   677   678   message 2 
10   677   681   message 3 
11   677   698   message 4 
12   678   677   message 5 

i Gruppe SENDER_ID wollen und recipient_id zwischen ihnen mit nur einem Parameter einzigartig. Zum Beispiel möchte ich Zeilen auswählen, die relevant für die Tabelle user_id 677 sind;

 
message_id | sender_id | recipient_id | message 
10   677   681   message 3 
11   677   698   message 4 
12   678   677   message 5 

Ich habe seit Stunden daran gearbeitet und ich habe nicht die gewünschten Ergebnisse erhalten.

+0

Warum sind Sie Meldung 3, wie es der Nachricht 0 Duplikat ist? – Ramesh

+0

, weil Benutzer (mit ID 677) zu unterschiedlichen Zeiten eine Nachricht an den Benutzer (mit der ID 681) sendet – hllktlhndd

Antwort

3

Hier ist eine Lösung

SELECT * 
    FROM message 
WHERE message_id 
    IN (SELECT MAX(message_id) 
      FROM message 
      GROUP BY CASE WHEN sender_id < recipient_id 
         THEN CONCAT(CONCAT(sender_id, ','), recipient_id) 
         ELSE CONCAT(CONCAT(recipient_id, ','), sender_id) 
        END) 
ORDER BY message_id ; 

Es wird nur einen kombinierten Schlüssel zwischen SENDER_ID und recipient_id die unterschiedlichen Datensätze finden Gruppe mit von .

SQL Fiddle hier Demo - http://sqlfiddle.com/#!9/9df65c/11

this helps

+0

danke für Ihre Antwort, ich habe userid Parameter hinzugefügt, so kann für bestimmte user_id erhalten werden http://sqlfiddle.com/#!9/9df65c/15 – hllktlhndd

+0

@hllktlhndd - Kein Problem. Danke für ein herausforderndes Problem zu lösen :) – Ramesh

0

Probieren Sie es aus ... Ich bin kein MySQL, aber ich denke, das wird für Sie funktionieren.

Select Max(Message_ID), Sender_ID, Recipient_ID, Max(Message) 
From Table 
Where Sender_ID = 677 OR Recipient_ID = 677 
Group By Sender_ID, Recipient_ID 
0

Sie können etwas tun:

select m.* 
from messages m 
where m.message_id = (select max(m2.message_id) 
         from messages m2 
         where (m2.sender_id, m2.receipient_id) in ((m.sender_id, m.receipient_id), (m.receipient_id, m.sender_id)) 
        ) and 
     677 in (m.sender_id, m.receipient_id); 
+0

Fehler: Unterabfrage gibt mehr als eine Zeile zurück – hllktlhndd

+0

@hllktlhndd. . . Duh! Ich habe das 'max() 'ausgelassen. –

0
create table #message 
(message_id int null, 
sender_id int null, 
recipient_id int null, 
message nchar(10) null) 

insert into #message(message_id,sender_id,recipient_id,message) 
values 
(6,677,681,'message 0'), 
(7,677,678,'message 1'), 
(9,677,678,'message 2'), 
(10,677,681,'message 3'), 
(11,677,698,'message 4'), 
(12,678,677,'message 5'); 

SELECT message_id,sender_id,recipient_id,message 
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY sender_id,recipient_id ORDER BY sender_id DESC) 'RowDistinctNumber' 
     FROM #message 
    )sub 
WHERE RowDistinctNumber = 1 

message_id sender_id recipient_id message 
----------- ----------- ------------ ---------- 
7   677   678   message 1 
10   677   681   message 3 
11   677   698   message 4 
12   678   677   message 5 

(4 row(s) affected) 
+0

Ich glaube nicht, dass MySQL die Funktion row_number() hat? – Ramesh