प्रत्येक पंक्ति के लिए "थ्रेड" निर्धारित करने का एक तरीका है CONCAT ()
LEAST
GREATEST<के साथ दो नंबरों में से /कोड>
एक ही दो संख्याओं का।
फिर हम GROUP BY
. कर सकते हैं "थ्रेड" पर, नवीनतम generated_time
प्राप्त करने के लिए . होने
. में खंड, हम केवल उन "थ्रेड" को फ़िल्टर करते हैं, जिनमें कम से कम एक 'INCOMING'
है 'समीक्षा'
. के साथ संदेश टाइप करें।
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;
परिणाम
| 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 |
सिडेनोट:
- उपरोक्त दृष्टिकोण (और आपका वर्तमान स्कीमा डिज़ाइन) इंडेक्स का उपयोग करने में सक्षम नहीं है, और इसलिए यह परफॉर्मेंट नहीं होगा ।
- मैं दो अतिरिक्त मास्टर टेबल बनाकर स्कीमा को फिर से डिज़ाइन करना चाहूंगा। एक मास्टर टेबल में फोन नंबर संग्रहित होंगे:
phone_id
, औरसंख्या
- एक और मास्टर टेबल "थ्रेड" को स्टोर करेगा, जिसमें
phone_id
होगा मान औरthread_id
. फिर आप इसthread_id
का उपयोग कर सकते हैं आपकेसंदेश
. में तालिका, फ़ोन नंबर संग्रहीत करने के बजाय।