كيفية الحصول على البيانات مرة أخرى من ماي لأيام التي ليس لها إحصاءات
سؤال
وأريد الحصول على عدد من التسجيلات العودة من فترة زمنية (ويقول في الأسبوع)، والتي ليس من الصعب القيام به، ولكني أتساءل عما إذا كان في أي حال من الممكن في الخلية للعودة إلى الصفر لعدة أيام التي ليس لها التسجيلات.
وعلى سبيل المثال: بيانات:
ID_Profile datCreate 1 2009-02-25 16:45:58 2 2009-02-25 16:45:58 3 2009-02-25 16:45:58 4 2009-02-26 10:23:39 5 2009-02-27 15:07:56 6 2009-03-05 11:57:30
وSQL:
SELECT DAY(datCreate) as RegistrationDate, COUNT(ID_Profile) as NumberOfRegistrations FROM tbl_profile WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY) GROUP BY RegistrationDate ORDER BY datCreate ASC;
في هذه الحالة ستكون النتيجة:
RegistrationDate NumberOfRegistrations 25 3 26 1 27 1 5 1
من الواضح أنا في عداد المفقودين بضعة أيام بين بين. حاليا أنا حل هذا في قانون بلدي بي، ولكني أتساءل عما اذا كان الخلية لديه أي طريقة للعودة تلقائيا 0 عن المفقودين أيام / الصفوف. وستكون هذه النتيجة المرجوة:
RegistrationDate NumberOfRegistrations 25 3 26 1 27 1 28 0 1 0 2 0 3 0 4 0 5 1
وبهذه الطريقة يمكننا استخدام الخلية من اجل حل أي مشاكل فيما يتعلق بعدد أيام في الشهر بدلا من الاعتماد على شفرة PHP لحساب عن كل شهر عدد الأيام هناك، منذ ماي ديه هذا البناء وظيفة في.
وشكرا مقدما
المحلول
لا، ولكن الحل واحد سيكون لإنشاء جدول من عمود واحد مع مفتاح تاريخ الابتدائي ومسبقة مع مواعيد كل يوم. وكنت قد التمور من أقرب نقطة البداية الحق من خلال بعض المستقبل خارج بكثير.
والآن، يمكن أن تترك JOIN البيانات الإحصائية الخاصة بك ضدها - ثم ستحصل على القيم الخالية لتلك الأيام مع أية بيانات. إذا كنت تريد حقا صفر بدلا من لاغية، استخدم <لأ href = "http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull" يختلط = "نوفولو noreferrer" > IFNULL (colname، 0)
نصائح أخرى
وبفضل بول ديكسون لقد وجدت الحل. أي شخص مهتم في كيف تحل هذه قراءة على:
أولا إنشاء إجراء مخزن وجدت في مكان ما لملء الجدول مع جميع التواريخ من هذا العام.
CREATE Table calendar(dt date not null); CREATE PROCEDURE sp_calendar(IN start_date DATE, IN end_date DATE, OUT result_text TEXT) BEGIN SET @begin = 'INSERT INTO calendar(dt) VALUES '; SET @date = start_date; SET @max = SUBDATE(end_date, INTERVAL 1 DAY); SET @temp = ''; REPEAT SET @temp = concat(@temp, '(''', @date, '''), '); SET @date = ADDDATE(@date, INTERVAL 1 DAY); UNTIL @date > @max END REPEAT; SET @temp = concat(@temp, '(''', @date, ''')'); SET result_text = concat(@begin, @temp); END call sp_calendar('2009-01-01', '2010-01-01', @z); select @z;
وبعد ذلك تغيير الاستعلام لإضافة اليسار الانضمام:
SELECT DAY(dt) as RegistrationDate, COUNT(ID_Profile) as NumberOfRegistrations FROM calendar LEFT JOIN tbl_profile ON calendar.dt = tbl_profile.datCreate WHERE dt BETWEEN DATE_SUB(CURDATE(),INTERVAL 6 DAY) AND CURDATE() GROUP BY RegistrationDate ORDER BY dt ASC
ونحن القيام به.
والشكر للجميع الردود سريعة والحل.