Eines der Probleme ist, dass die Tupel ('connor',‘ Alice ') und (' Alice ',' connor ') in `private_messages` repräsentieren die gleiche Konversation/Raum, egal was du zählst.
Ein Ansatz wäre eine Gesamtzahl der verschiedenen Werte zu erhalten und durch zwei zu teilen, aber das scheint nicht wirklich der richtige Weg zu sein. (Wir können einige Grenzfälle Setup, wo das Ergebnis wir zurück sind keine ganze Zahl ist, oder kleiner ist als die tatsächliche Anzahl der aktiven Räume .... zB
id message_from message_to
-- ------------ ----------
1 Alice conor
2 Alice conor
3 conor Alice
4 Anderson conor
5 Cooper Alice
6 Dalton Allman
Ein anderer Ansatz wäre es, die Werte neu zu ordnen in die Tupel (swapping message_from und message_to) in einigen Zeilen, die mit message_from und message_two auf der anderen Seite der Konversation übereinstimmen. Zum Beispiel könnten wir message_from und message_to vergleichen und sie austauschen, wenn message_to niedriger ist als message_from.
Zur Veranschaulichung verwenden Sie einen Ausdruck, um Werte zurückzugeben, die in den Spalten m_one und m_two angezeigt werden:
id message_from message_to m_one t_two
-- ------------ ---------- ----- -----
1 Alice conor Alice conor
2 Alice conor Alice conor
3 conor Alice Alice conor
4 Anderson conor Anderson conor
5 Cooper Alice Alice Cooper
6 Allman Dalton Allman Dalton
Und dann konnten wir die unterschiedlichen Werte der (m_one, m_zwei) Tupel zählen.
Ein dritter Ansatz wäre, alle Tupel zu verwerfen, bei denen der Wert message_from höher ist als message_to, um eine Seite der Konversation/des Raumes loszuwerden. Und dann eine Zählung der verschiedenen Tupel, die übrig bleiben. Dies würde jedoch einige Gespräche/Räume, die Nachrichten in nur einer Richtung hatten, möglicherweise ausschließen.
id message_from message_to m_one t_two
-- ------------ ---------- ----- -----
1 Alice conor Alice conor
2 Alice conor Alice conor
3 conor Alice Alice conor
4 Anderson conor Anderson conor
5 Cooper Alice (NULL) (NULL)
6 Allman Dalton Allman Dalton
(Wir werden beiseite eine Diskussion über die Ecke bei einem Gespräch/Raum gesetzt, wo message_from zu message_to gleich ist.)
Die SQL wir wirklich auf das, was Algorithmus schreiben, hängt wir möchte implementieren.
Wir könnten eine GROUP BY verwenden, um "übereinstimmende" Zeilen zu reduzieren und eine Zählung zu erhalten. Oder wir könnten eine COUNT(DISTINCT foo)
verwenden, um eine Anzahl unterschiedlicher Werte zu erhalten. Wenn wir einen Algorithmus auswählen, der Werte "vertauschen" muss, können wir Ausdrücke verwenden, die die Funktionen LEAST
und GREATEST
verwenden. Oder MySQL IF() - Funktion oder CASE-Ausdrücke.
Wenn wir Zeilen von der Zählung ausschließen möchten, können wir ein Prädikat in die WHERE-Klausel aufnehmen.
Alle diese sind möglich, und es gibt mehrere Möglichkeiten, das angegebene Ergebnis zu erzielen.
Eigentlich sollte Ihre Tabelle eine weitere Spalte mit dem Namen 'conversation_id' haben, oder im schlimmsten Fall brauchen Sie individuelle Tabellen für jede Konversation. – Manikiran
Was ist Ihre gewünschte Ausgabe? –