- SqlFiddle
SELECT m.*, CASE
WHEN sender <= recipient THEN concat(sender,'-',recipient)
ELSE concat(recipient,'-', sender)
END as conversation
FROM message m
ORDER BY conversation, id
OUTPUT
| id | sender | recipient | conversation |
|----|---------|-----------|-----------------|
| 6 | denis | julie | denis-julie |
| 10 | denis | julie | denis-julie |
| 9 | denis | marc | denis-marc |
| 4 | julie | georgette | georgette-julie |
| 2 | gépéto | sylvain | gépéto-sylvain |
| 8 | sylvain | gépéto | gépéto-sylvain |
| 7 | julie | rémi | julie-rémi |
| 1 | marc | rémi | marc-rémi |
| 3 | rémi | marc | marc-rémi |
| 5 | rémi | marc | marc-rémi |
aproach, marc-rémi, , MIN() .
SqlFiddleDemo
SELECT conversation_id, T.id, T.sender, T.recipient, T.conversation
FROM (
SELECT CASE
WHEN sender <= recipient THEN concat(sender,'-',recipient)
ELSE concat(recipient,'-', sender)
END as conversation,
MIN(id) as conversation_id
FROM message m
GROUP BY conversation
) as convesation_start
JOIN (
SELECT m.*, CASE
WHEN sender <= recipient THEN concat(sender,'-',recipient)
ELSE concat(recipient,'-', sender)
END as conversation
FROM message m
) as T
ON
convesation_start.conversation = T.conversation
ORDER BY conversation_id, T.id
OUTPUT
| conversation_id | id | sender | recipient | conversation |
|-----------------|----|---------|-----------|-----------------|
| 1 | 1 | marc | rémi | marc-rémi |
| 1 | 3 | rémi | marc | marc-rémi |
| 1 | 5 | rémi | marc | marc-rémi |
| 2 | 2 | gépéto | sylvain | gépéto-sylvain |
| 2 | 8 | sylvain | gépéto | gépéto-sylvain |
| 4 | 4 | julie | georgette | georgette-julie |
| 6 | 6 | denis | julie | denis-julie |
| 6 | 10 | denis | julie | denis-julie |
| 7 | 7 | julie | rémi | julie-rémi |
| 9 | 9 | denis | marc | denis-marc |