Jedním ze způsobů, jak určit "vlákno" pro každý řádek, je CONCAT()
LEAST
ze dvou čísel s GREATEST
ze stejných dvou čísel.
Potom můžeme GROUP BY
na "vlákně", abyste získali nejnovější generated_time
. V HAVING
klauzule, odfiltrujeme pouze to "vlákno", které má alespoň jeden 'INCOMING'
zprávu s 'REVIEW'
typ.
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;
Výsledek
| 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 |
Sidenote:
- Výše uvedený přístup (a váš současný návrh schématu) není schopen používat indexy, a proto nebude výkonný .
- Raději bych přepracoval schéma vytvořením dvou dalších hlavních tabulek. Jedna hlavní tabulka by ukládala telefonní čísla:
phone_id
anumber
- V jiné hlavní tabulce by bylo uloženo vlákno, které bude obsahovat
phone_id
hodnoty athread_id
. Poté můžete použít totothread_id
ve vašímessage
místo ukládání telefonních čísel.