Une façon de déterminer le "thread" pour chaque ligne est CONCAT()
le LEAST
des deux nombres avec le GREATEST
des deux mêmes nombres.
On peut alors GROUP BY
sur le "thread", pour obtenir le dernier generated_time
. Dans HAVING
clause, nous filtrons uniquement les "threads", qui ont au moins un 'INCOMING'
message avec 'REVIEW'
saisir.
SELECT m1.*
FROM message AS m1
JOIN (SELECT Concat(Least(m.from_number, m.to_number), '|',
Greatest(m.from_number,
m.to_number))
AS
thread,
Max(m.generated_time)
AS max_generated_time
FROM message AS m
GROUP BY thread
HAVING Sum(m.direction = 'INCOMING'
AND m.type = 'REVIEW')) AS dt
ON dt.thread = Concat(Least(m1.from_number, m1.to_number), '|',
Greatest(m1.from_number, m1.to_number))
AND dt.max_generated_time = m1.generated_time;
Résultat
| id | to_number | from_number | message | direction | type | generated_time |
| --- | ------------ | ------------ | --------------- | --------- | ------ | ------------------- |
| 3 | +15005550004 | +16232950692 | How are you ? | OUTGOING | | 2019-07-13 21:15:00 |
| 5 | +16232950692 | +15005550001 | Have a nice day | INCOMING | REVIEW | 2019-07-12 12:17:00 |
Note complémentaire :
- L'approche ci-dessus (et votre conception de schéma actuelle) n'est pas capable d'utiliser des index, et donc elle ne sera pas performante .
- Je préférerais reconcevoir le schéma en créant deux tables Master supplémentaires. Une table principale stockerait les numéros de téléphone :
phone_id
, etnumber
- Une autre table maître stockerait le "Thread", qui contiendrait le
phone_id
valeurs etthread_id
. Vous pouvez ensuite utiliser cethread_id
dans votremessage
table, au lieu de stocker les numéros de téléphone.