2016-08-08 11 views
0

Ich kann einfach nicht herausfinden, wie Sie das Folgende tun.Mysql Query kombinieren zwei Spalten und erhalten eindeutige Werte von beiden

Was ich

haben ... ist eine MySQL-Tabelle "Mails" wie:

id | sender | recipient | date     | content | read 
--------------------------------------------------------------- 
1 | 3  | 2   | 2016-07-29 09:04:21 | hello | 1 
2 | 2  | 3   | 2016-07-29 09:14:21 | hello | 1 
3 | 1  | 2   | 2016-07-29 09:24:21 | hello | 1 
4 | 1  | 3   | 2016-07-29 09:34:21 | hello | 0 
5 | 1  | 1   | 2016-07-29 09:44:21 | hello | 1 
6 | 3  | 1   | 2016-07-29 09:54:21 | hello | 0 
7 | 1  | 1   | 2016-07-29 09:56:21 | hello | 1 
8 | 1  | 3   | 2016-07-29 09:58:21 | hello | 0 
9 | 2  | 2   | 2016-07-29 09:59:21 | hello | 0 

Was ich brauche

... ist, einen Überblick zu bekommen, die neuesten Chatpartner für eine Person, wie der Benutzer mit der ID 1 (der Benutzer kann auch Nachrichten an sich selbst senden) wie

date    | partner 
2016-07-29 09:58:21 | 3 
2016-07-29 09:56:21 | 1 
2016-07-29 09:24:21 | 2 

Egal ob der Benutzer Empfänger oder Absender ist und egal wie viele Nachrichten gesendet oder empfangen wurden. (I umfasste die Datumsspalte in der Beispielausgabe zu klären ich sie nach Datum, absteigend sortiert müssen, es muss nicht in das Endergebnis einbezogen werden)

Was ich versucht

SELECT DISTINCT sender,recipient 
FROM mails 
WHERE recipient=1 OR sender=1 
ORDER BY date DESC 

aber von Natürlich kombiniert es nicht die beiden Spalten. Die Ausgabe ist

sender | recipient 
1  | 3 
1  | 1 
3  | 1 
1  | 2 

Wenn ich GROUP BY sender fügen Sie es nicht die E-Mails anzuzeigen, in dem Benutzer 1 nur Empfänger ist.

Ich habe auch versucht die folgenden

SELECT 
    max(date) as d, 
    CONCAT(greatest(sender,recipient),"_",least(sender,recipient)) AS p 
FROM mails 
WHERE recipient=1 OR sender=1 
GROUP BY p ORDER BY d DESC 

, die zum Beispiel

d     | p 
2016-07-29 09:58:21 | 3_1 
2016-07-29 09:56:21 | 1_1 
2016-07-29 09:24:21 | 2_1 

gibt Was groß zu sein scheint, kann ich nur die erste ID nehmen ... gezeigt, aber wenn ich Suche nach Benutzer-ID 2, gibt es

d     | p 
2016-07-29 09:59:21 | 2_2 
2016-07-29 09:24:21 | 2_1 
2016-07-29 09:14:21 | 3_2 

... so ist es unklar, ob die erste oder zweite ID ist die ID des Partners.

Ergebnis

Ich bin ein bisschen verzweifelt. Jede Hilfe wäre großartig.

+0

Beitrag der erwartete Ausgabe – jonju

+0

Huh? Was ich erwarte, kann man im Bereich "Was ich brauche" sehen. Ich habe gerade erwähnt, dass das Datum col kein Muss ist. –

Antwort

2

Ich glaube, Sie wollen eine Aggregation wie folgt aus:

select max(date) as date, 
     (case when m.recipient = 1 then m.sender else m.recipient end) as partner 
from mails 
where 1 in (m.recipient, m.sender) 
group by (case when m.recipient = 1 then m.sender else m.recipient end) 
order by max(date); 
+0

Funktioniert wie ein Charme, nachdem ich 'von Mails m' und 'DESC' an der und :) Vielen Dank! –

+0

Ist 1 in (m.empfänger, m.sender) und (m.empfänger = 1 oder m.sender = 1) gleich? – rocks

+0

@rocks. . . Sie sind gleich. –

1

Verwenden Sie eine Unterabfrage für jede recipient max Datum zu erhalten, dann verbinden sich:

select m.`recipient` as partner, m.`date` 
from mails m 
join (
    select max(`date`) as `date`, `recipient` 
    from mails 
    where sender = '1' 
    group by `recipient` 
) t 
on m.`date` = t.`date` and m.`recipient` = t.`recipient` 
where m.sender = '1' 
order by m.`date` desc 

Demo Here

+0

Ich lief die Abfrage, aber leider gibt es nicht die Partner, wo 1 ist nur Empfänger und nie der Absender :( –