"नवीनतम प्रति समूह" समस्या अत्यंत है एसक्यूएल में आम। अकेले इस साइट पर इस समस्या के समाधान के अनगिनत उदाहरण हैं।
यदि आपका टाइमस्टैम्प प्रति सदस्य गतिविधि के लिए अद्वितीय है:
SELECT
m.id,
m.name,
a.code activity_code,
a.timestamp activity_timestamp,
a.description activity_description
FROM
members m
INNER JOIN activities a ON a.member_id = m.id
WHERE
a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)
वैकल्पिक रूप से, यदि आपकी गतिविधि आईडी समय के साथ एकरस रूप से बढ़ रही है:
...
WHERE
a.id = (SELECT MAX(id) FROM activities WHERE member_id = m.id)
आपको समूह बनाने की आवश्यकता नहीं है। लेकिन क्वेरी activities
. पर एक अनुक्रमणिका से लाभान्वित होगी (member_id, timestamp)
से अधिक या (member_id, id)
, क्रमशः।
संपादित करें
ऐसे किसी भी सदस्य को दिखाने के लिए, जिन्होंने कोई गतिविधि लॉग नहीं की है, इस तरह से एक लेफ्ट जॉइन का उपयोग करें।
SELECT
m.id,
m.name,
a.code activity_code,
a.timestamp activity_timestamp,
a.description activity_description
FROM
members m
LEFT JOIN activities a ON
a.member_id = m.id
AND a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)
ध्यान दें कि कोई WHERE
नहीं है खंड। अर्थ की दृष्टि से, WHERE को बाद लागू किया जाता है जोड़ किए जाते हैं। तो WHERE क्लॉज उन पंक्तियों को हटा देगा जिन्हें LEFT JOIN जोड़ा गया है, प्रभावी रूप से मूल INNER JOIN के समान परिणाम दे रहा है।
लेकिन अगर आप अतिरिक्त विधेय को सीधे शामिल होने की स्थिति में लागू करते हैं, तो LEFT JOIN अपेक्षा के अनुरूप काम करेगा।