मुझे लगता है कि यह ऐसा करता है।
select
t_task.task_id,
t_task.task_name,
latest_action.act_date,
IFNULL(t_act_d.act_name, 'Pending') as act_name
from
t_task
left outer join (
select
@row_num := IF(@prev_value=concat_ws('', t_act.task_id),@row_num+1, 1) as row_number,
t_act.task_id,
t_act.act_id,
t_act.act_date,
@prev_value := concat_ws('', t_act.task_id) as z
from
t_act,
(select @row_num := 1) x,
(select @prev_value := '') y
order by
t_act.task_id,
t_act.act_date desc
) as latest_action on
t_task.task_id = latest_action.task_id
left outer join t_act_d on
latest_action.act_id = t_act_d.act_id
where
latest_action.row_number = 1 or
latest_action.row_number is null
order by
case when latest_action.act_date is null then '9999-01-01' else latest_action.act_date end
आपके द्वारा प्रदान किए गए डेटा के परिणाम हैं:
+---------+-----------------+------------+-----------+
| task_id | task_name | act_date | act_name |
+---------+-----------------+------------+-----------+
| A1 | PC Proc | 2017-07-17 | Execution |
| A2 | Printer Proc | 2017-07-21 | Surveying |
| A3 | Stationery Proc | NULL | Pending |
+---------+-----------------+------------+-----------+
मैं टी-एसक्यूएल से अधिक परिचित हूं, जहां मैं row_number() विंडो फ़ंक्शन का उपयोग करता हूं। विचार यह है कि row_number फ़ील्ड प्रत्येक पंक्ति की रैंकिंग को इस संदर्भ में दिखाए कि क्या यह सबसे हाल का (मान 1), दूसरा सबसे हाल का (मान 2) आदि प्रत्येक कार्य के लिए कार्रवाई है। प्रत्येक कार्य के लिए नवीनतम क्रिया 1 की पंक्ति_संख्या के साथ समाप्त होती है, इसलिए आप इस latest_action
से row_number =1 पर फ़िल्टर करके इन्हें प्राप्त कर सकते हैं। सबक्वेरी
क्योंकि latest_action
सबक्वायरी एक बार समग्र रूप से चलती है, प्रति पंक्ति एक बार नहीं, यह एक प्रदर्शन हिट का अधिक नहीं है। दुर्भाग्य से, मैं यह वादा नहीं कर सकता कि संपूर्ण चर सेटिंग / वृद्धिशील चीज़ एक प्रदर्शन हिट नहीं है, यह पहली बार है जब मैंने MySQL में इस तर्क का उपयोग किया है, मुझे नहीं पता कि यह कितना प्रदर्शनकारी है।पी>
T-SQL की row_number() कार्यक्षमता को पुन:पेश करने का तर्क यहाँ से आया: ROW_NUMBER() MySQL में