मैं दो तारीख सीमा के बीच डेटा का चयन करने की कोशिश कर रहा हूं। हालांकि सभी डेटा प्रतिदिन नहीं डाले जा रहे हैं। नीचे तालिका का नमूना है:
mysql> SELECT * FROM attendance;
+------------+-------+
| date | total |
+------------+-------+
| 2012-07-02 | 100 |
| 2012-07-04 | 70 |
| 2012-07-05 | 78 |
+------------+-------+
3 rows in set (0.00 sec)
परिदृश्य यह है कि मैं 2012-07-02 से 2012-07-04 तक कुल उपस्थिति प्राप्त करना चाहता हूं। उपरोक्त डेटा के आधार पर मुझे मिलेगा
mysql> SELECT * FROM attendance WHERE date BETWEEN "2012-07-02" AND "2012-07-04";
+------------+-------+
| date | total |
+------------+-------+
| 2012-07-02 | 100 |
| 2012-07-04 | 70 |
+------------+-------+
2 rows in set (0.00 sec)
हालांकि मेरा उद्देश्य परिणाम में 2012-07-03 शामिल होना है।
+------------+-------+
| date | total |
+------------+-------+
| 2012-07-02 | 100 |
| 2012-07-03 | 0 |
| 2012-07-04 | 70 |
+------------+-------+
क्या यह MySQL के माध्यम से किया जा सकता है? मैंने देखा अस्थायी तालिका। लेकिन अभी भी उद्देश्य प्राप्त करने में असमर्थ है।
उत्तर:
जवाब के लिए 0 № 1यह एक साधारण समाधान के साथ एक आम समस्या है।
नियमित तालिका बनाएं, आरईएफ_DATE कहें, और इसमें 3 साल की सभी तारीखों या स्टोर की आवश्यकता के लिए सभी तिथियां स्टोर करें।
फिर ए के बाईं ओर इस तालिका का उपयोग करें LEFT OUTER JOIN
SELECT REF.date,IFNULL(A.total,0) as total FROM REF_DATE REF
LEFT OUTER JOIN attendance
ON REF.date=A.date
A WHERE REF.date BETWEEN "2012-07-02" AND "2012-07-04";
DATE MySQL में एक कीवर्ड है, मैंने इसे पठनीयता के लिए यहां उपयोग किया है। एक अलग कॉलम नाम का प्रयोग करें।
उत्तर № 2 के लिए 1
आप व्युत्पन्न छद्म-तालिका के रूप में दिनांकों की गणना कर सकते हैं (के साथ UNION
) और फिर अपने डेटा के साथ इसमें शामिल हों
SELECT dates.date, COALESCE(attendance.total,0) AS total FROM (
SELECT "2012-07-02" AS date
UNION ALL SELECT "2012-07-03"
UNION ALL SELECT "2012-07-04"
) AS dates
LEFT JOIN attendance USING(date)
संपादित करें: जोड़ा गया COALESCE
लौटने के लिये 0
के बजाय NULL
लापता रिकॉर्ड पर।
जवाब के लिए 0 № 3
MySQL डेटा उत्पन्न नहीं कर सकता है जो वहां नहीं है। यदि आप अस्तित्वहीन तिथियां चाहते हैं, तो आपको एक अस्थायी तालिका की आवश्यकता होगी जिसमें आपके द्वारा शामिल की गई पूर्ण तिथि सीमा शामिल हो। दूसरा विकल्प सर्वर-साइड वैरिएबल को बनाए रखना है और प्रत्येक पंक्ति के लिए कुछ दिनांक गणित करना है, जो बदसूरत है
select @dateval := "2012-07-02";
SELECT @dateval := @dateval + INTERVAL 1 DAY from ...