2012-05-29 13 views
5

मुझे चार्टिंग उद्देश्यों के लिए इसकी आवश्यकता है। असल में मुझे यह करना है:क्या MySQL परिणाम सेट में "नकली" पंक्तियां उत्पन्न करने का कोई तरीका है?

  1. बिना किसी अंश के सभी भेजे गए एसएमएस का चयन करें, दिन-दर-दिन जोड़े/गणना जोड़े के साथ सरणी प्राप्त करें;
  2. मेरी मेज में किसी भी रिकॉर्ड के बिना दिनों के लिए "नकली" पंक्तियां जोड़ें, जो शून्य के साथ सभी तिथियों को "अंतराल" भर रहा है।

एक उदाहरण परिणाम और इसी तालिका (यहाँ सरलीकृत) होगा:

array(
    '2012-05-26 00:00:00' => 1, 
    '2012-05-27 00:00:00' => 0, // Fake added row 
    '2012-05-28 00:00:00' => 2, 
) 

+----------------+----------------------+ 
| Table SMS | id | sent_at    | 
+----------------+----------------------+ 
|   | 1 | 2012-05-26 21:58:41 | 
+----------------+----------------------+ 
|   | 2 | 2012-05-28 22:19:21 | 
+----------------+----------------------+ 
|   | 3 | 2012-05-28 02:19:21 | 
+----------------+----------------------+ 

वहाँ ऐसा करने या मैं स्वयं पीएचपी सरणियों के साथ खेल रहा है चाहिए के लिए किसी भी एसक्यूएल आदेश है?

+1

इसके पीछे तर्क क्या होगा? कुछ चार्टिंग पुस्तकालयों में –

+0

@ कोलेजोहनसन आपको लाइन चार्ट प्राप्त करने के लिए टाइमस्टैम्प (एक्स अक्ष) और मान (वाई अक्ष) निर्दिष्ट करना होगा। चूंकि मैं केवल एसएमएस भेज रहा हूं, मुझे तिथियों के अंतर को भरने की आवश्यकता है। – gremo

+0

इसके लिए मैं क्या करता हूं, जबकि लूप जो सरणी बनाता है, तारीख को दिनांक सीमाओं की सरणी से अगली बार जांचें, और आवश्यकतानुसार डालें। –

उत्तर

4

आप एक संघ वक्तव्य

SELECT 
    sent_at, 
    Count(*) 
FROM (Select 
     id, 
     DATE(sent_at) as sent_at 
     FROM TableName 
     Group by Date(sent_at) 
     UNION ALL 
     Select 
     '0' as id, 
     DATE('2012-05-27') as sent_at) derived_table 
Group By sent_at 

मैं के खिलाफ में शामिल होने के लिए एक विशेष तालिका बनाने का सुझाव दिया है संपादित कर सकते हैं।

CREATE TABLE DateTable (
    DateValue DateTime, 
    Year Int, 
    Month Int, 
    Day Int) 

क्वेरी करने अब पर्वतमाला आप जानना चाहते हैं के भीतर सभी दिनांक मानों के साथ इस तालिका को पॉप्युलेट करने के लिए एक datetable की

निर्माण। आप किसी भी वैध तिथि के साथ आसानी से इस तालिका में शामिल हो सकते हैं। आपको उन तिथियों के लिए एकत्रित करने की अनुमति है जो मौजूद हैं और मौजूद नहीं हैं।

+2

अगर मैं गलत हूं तो मुझे सही करें, लेकिन यह परिणाम सेट में केवल एक पंक्ति जोड़ देगा। मुझे सभी तिथियों के बीच "अंतराल" भरना होगा। – gremo

+1

@gremo यदि आप सभी विशिष्ट तिथियों को गिनना चाहते हैं तो आपको "नकली पंक्तियों" के साथ व्युत्पन्न तालिका का उपयोग करने की आवश्यकता होगी (जो अंतराल को बनाते हैं)। यदि आप अंतराल को गतिशील रूप से भरना चाहते हैं तो मैं सुझाव देता हूं कि आप अपने लिए एक तिथि तालिका बनाएं, जिसमें एक विशिष्ट समय सीमा के लिए सभी तिथियां शामिल होंगी। फिर लापता तिथियां पाने के लिए इस तालिका में शामिल हों। –

1

हाँ, मैं यह सब समय

DROP PROCEDURE IF EXISTS `Example`; 
DELIMITER $$ 

CREATE PROCEDURE `Example` (
    $StartDate DATE, 
    $EndDate DATE 
    ) 
BEGIN 

    DECLARE $curDay DATE; 
    SET $StartDate = IFNULL($StartDate,'2000-01-01'); 
    SET $curDay = $StartDate; 


    DROP TEMPORARY TABLE IF EXISTS `Day`; 
    CREATE TEMPORARY TABLE `Day`(
     `Date` DATE 
    ); 

    DaysLoop:LOOP 

     INSERT INTO 
      `Day`(`Date`) 
     SELECT 
      $curDay 
     ; 

     SET $curDay = $curDay + INTERVAL 1 DAY; 

     IF 
      $curDay >= $EndDate OR $curDay >= NOW() 
     THEN 
      LEAVE DaysLoop; 
     END IF; 

    END LOOP DaysLoop; 

    SELECT 
     D.Date, 
     COUNT(S.id) 
    FROM 
     `Day` AS D 
    LEFT JOIN 
     `SMS` AS S 
     ON D.Date = DATE(S.sent_at) 
    GROUP BY 
     D.Date 
    ORDER BY 
     D.Date 
    ; 

END $$ 

DELIMITER ; 

CALL Example('2012-01-01','2012-05-01'); 

मैं का उपयोग करें और रिपोर्ट के लिए संग्रहित प्रक्रियाओं की सलाह देते हैं, बस सुनिश्चित करें कि आप संस्करण नियंत्रण स्क्रिप्ट और whatnot बनाने करते हैं।

+0

ओह और आपके पास 'समूह द्वारा' होना आवश्यक नहीं है, या इसे DAY_HOUR आदि द्वारा समूह में बनाया जा सकता है – KCD

संबंधित मुद्दे