ठीक है, तो चलिए इसे आजमाते हैं और देखते हैं कि यह काम करता है या नहीं।
यह वह स्कीमा है जिसके साथ मेरे पास कुछ है। यह बहुत आसान है लेकिन आपके उपयोग के मामले का समर्थन करता है।
CREATE TABLE employees (
id int unsigned auto_increment,
name varchar(255),
PRIMARY KEY(id)
);
CREATE TABLE leave_type (
id int unsigned auto_increment,
name varchar(255),
PRIMARY KEY(id)
);
CREATE TABLE leave_log (
id int unsigned auto_increment,
leave_type_id int unsigned,
employee_id int unsigned,
is_full_day int unsigned,
is_half_day int unsigned,
PRIMARY KEY(id)
);
कुछ परीक्षण डेटा ...
INSERT INTO employees VALUES (14, 'Lisa'), (15, 'Homer'), (13, 'Bart');
INSERT INTO leave_type VALUES (1, 'Annual'), (2, 'Unpaid'), (3, 'Exam');
INSERT INTO leave_log VALUES (NULL, 3, 14, 1, 0), (NULL, 1, 14, 1, 0), (NULL, 1, 14, 0, 1), (NULL, 1, 14, 0, 1);
INSERT INTO leave_log VALUES (NULL, 2, 15, 0, 1);
INSERT INTO leave_log VALUES (NULL, 3, 13, 1, 0), (NULL, 1, 13, 1, 0);
कॉलम नामों और परिभाषाओं पर बहुत अधिक ध्यान केंद्रित न करें, मैंने स्कीमा को बिल्कुल भी पॉलिश नहीं किया क्योंकि मुझे ऐसा करने के लिए आपके ऐप के बारे में पर्याप्त जानकारी नहीं है।
एक बार जब स्कीमा बन जाता है और उसमें डेटा हो जाता है, तो यह बहुत ही सरल क्वेरी वही करेगी जो आप चाहते हैं।
SELECT e.name, SUM(annual.is_half_day), SUM(unpaid.is_half_day), SUM(exam.is_half_day),
SUM(annual.is_full_day), SUM(unpaid.is_full_day), SUM(exam.is_full_day)
FROM employees e
LEFT JOIN leave_log annual ON annual.leave_type_id = 1 AND annual.employee_id = e.id
LEFT JOIN leave_log unpaid ON unpaid.leave_type_id = 2 AND unpaid.employee_id = e.id
LEFT JOIN leave_log exam ON exam.leave_type_id = 3 AND exam.employee_id = e.id
GROUP BY e.id
एक नज़र डालें और देखें कि आप क्या सोचते हैं। क्या यह एक उच्च प्रदर्शन या भारी लोड वाला एप्लिकेशन होने की संभावना है?
संपादित करें
यह क्वेरी अधिक शामिल है और इसमें शायद कुछ प्रदर्शन कमियां होंगी लेकिन यह अधिक सटीक हो सकती है।
SELECT e.name, e.id,
IFNULL(annual_half.total, 0) annual_half,
IFNULL(unpaid_half.total, 0) unpaid_half,
IFNULL(exam_half.total, 0) exam_half,
IFNULL(annual_full.total, 0) annual_full,
IFNULL(unpaid_full.total, 0) unpaid_full,
IFNULL(exam_full.total, 0) exam_full
FROM employees e
LEFT JOIN ( SELECT SUM(is_full_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_full_day = 1 AND leave_type_id = 1 GROUP BY 3, 2) annual_full ON annual_full.employee_id = e.id
LEFT JOIN ( SELECT SUM(is_full_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_full_day = 1 AND leave_type_id = 2 GROUP BY 3, 2) unpaid_full ON unpaid_full.employee_id = e.id
LEFT JOIN ( SELECT SUM(is_full_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_full_day = 1 AND leave_type_id = 3 GROUP BY 3, 2) exam_full ON exam_full.employee_id = e.id
LEFT JOIN ( SELECT SUM(is_half_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_half_day = 1 AND leave_type_id = 1 GROUP BY 3, 2) annual_half ON annual_half.employee_id = e.id
LEFT JOIN ( SELECT SUM(is_half_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_half_day = 1 AND leave_type_id = 2 GROUP BY 3, 2) unpaid_half ON unpaid_half.employee_id = e.id
LEFT JOIN ( SELECT SUM(is_half_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_half_day = 1 AND leave_type_id = 3 GROUP BY 3, 2) exam_half ON exam_half.employee_id = e.id
GROUP BY 1;