मुझे जो समझ में आया उसे संक्षेप में बताएं:आप प्रत्येक टिकट और उसके अंतिम समाधान का चयन करना चाहेंगे।
मुझे इस तरह के प्रश्न के लिए निम्नलिखित पैटर्न का उपयोग करना पसंद है क्योंकि यह सबक्वायरी पैटर्न से बचा जाता है और इसलिए यह अच्छा है जहां प्रदर्शन की आवश्यकता होती है। दोष यह है कि इसे समझना थोड़ा मुश्किल है:
SELECT
t.*,
s1.*
FROM tickets t
INNER JOIN solutions s1 ON t.id = s1.ticket_id
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id AND s2.id > s1.id
WHERE s2.id IS NULL;
मैंने बेहतर समझ के लिए केवल पैटर्न का दिल लिखा है।
कुंजियाँ हैं:
-
solutions
. में से बायां जॉइनs1.ticket_id = s2.ticket_id
. के साथ तालिका शर्त:यहGROUP BY ticket_id
. का अनुकरण करता है । -
शर्त
s2.id > s1.id
:यह "मैं केवल अंतिम समाधान चाहता हूं" के लिए SQL है, यहMAX()
का अनुकरण करता है . मुझे लगता है कि आपके मॉडल में,the last
मतलबwith the greatest id
लेकिन आप यहां तिथि पर एक शर्त का उपयोग कर सकते हैं। ध्यान दें किs2.id < s1.id
आपको पहला समाधान देगा। -
WHERE क्लॉज
s2.id IS NULL
:सबसे अजीब लेकिन बिल्कुल जरूरी... केवल वही रिकॉर्ड रखता है जो आप चाहते हैं।
कोशिश करें और मुझे बताएं :)
संपादित करें 1: मुझे बस एहसास हुआ कि दूसरी बिंदु धारणा समस्या की देखरेख कर रही थी। यह इसे और भी दिलचस्प बनाता है :p मैं यह देखने की कोशिश कर रहा हूं कि यह पैटर्न आपके date, id
के साथ कैसे काम कर सकता है आदेश देना।
2 संपादित करें: ठीक है, यह थोड़ा मोड़ के साथ बहुत अच्छा काम करता है। LEFT JOIN पर शर्त बन जाती है:
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id
AND (s2.date > s1.date OR (s2.date = s1.date AND s2.id > s1.id))