2010-03-19 14 views
8

ग्रुप का उपयोग कर रहा MySQL तालिका मिल गया हैMySQL: शून्य से रिक्त फ़ील्ड भरने जब द्वारा

CREATE TABLE cms_webstat (
    ID int NOT NULL auto_increment PRIMARY KEY, 
    TIMESTAMP_X timestamp DEFAULT CURRENT_TIMESTAMP, 
    # ... some other fields ... 
) 

जो साइट आगंतुकों के बारे में आंकड़े शामिल हैं।
प्रति घंटे का दौरा हो रही के लिए मैं

SELECT 
    hour(TIMESTAMP_X) as HOUR 
    , count(*) AS HOUR_STAT 
FROM cms_webstat 
GROUP BY HOUR 
ORDER BY HOUR DESC 

का उपयोग जो मुझे

| HOUR | HOUR_STAT | 
| 24 | 15  | 
| 23 | 12  | 
| 22 | 9  | 
| 20 | 3  | 
| 18 | 2  | 
| 15 | 1  | 
| 12 | 3  | 
| 9 | 1  | 
| 3 | 5  | 
| 2 | 7  | 
| 1 | 9  | 
| 0 | 12  | 

देता है और मैं निम्नलिखित प्राप्त करना चाहते हैं: मैं कैसे प्राप्त करने के लिए क्वेरी को संशोधित करना चाहिए

| HOUR | HOUR_STAT | 
| 24 | 15  | 
| 23 | 12  | 
| 22 | 9  | 
| 21 | 0  | 
| 20 | 3  | 
| 19 | 0  | 
| 18 | 2  | 
| 17 | 0  | 
| 16 | 0  | 
| 15 | 1  | 
| 14 | 0  | 
| 13 | 0  | 
| 12 | 3  | 
| 11 | 0  | 
| 10 | 0  | 
| 9 | 1  | 
| 8 | 0  | 
| 7 | 0  | 
| 6 | 0  | 
| 5 | 0  | 
| 4 | 0  | 
| 3 | 5  | 
| 2 | 7  | 
| 1 | 9  | 
| 0 | 12  | 

ऐसा परिणाम (एक mysql क्वेरी के साथ, अस्थायी तालिकाओं के बिना)?
क्या यह एक परिणाम MySQL क्वेरी के साथ प्राप्त करना संभव है?

+0

साल्टलेक, क्या आपको लगता है कि आप एक जवाब स्वीकार करेंगे? –

+0

मार्कस, आपका समाधान काम करता है लेकिन जिस तरह से मैं इसे बनना चाहता हूं। मुझे एक एसक्यूएल क्वेरी के साथ समाधान में दिलचस्पी है और बिना किसी टेबल को भरना और भरना। – SaltLake

उत्तर

4

मुझे फिनली को जवाब मिला है। शायद मैं पागल हूं, लेकिन यह काम करता है।

 
SELECT HOUR, max(HOUR_STAT) as HOUR_STAT FROM (
    (
     SELECT HOUR(TIMESTAMP_X) as HOUR, count(*) as HOUR_STAT 
     FROM cms_webstat 
     WHERE date(TIMESTAMP_X) = date(now()) 
    ) 
    UNION (SELECT 0 as HOUR, 0) 
    UNION (SELECT 1 as HOUR, 0) 
    UNION (SELECT 2 as HOUR, 0) 
    UNION (SELECT 3 as HOUR, 0) 
    UNION (SELECT 4 as HOUR, 0) 
    UNION (SELECT 5 as HOUR, 0) 
    UNION (SELECT 6 as HOUR, 0) 
    UNION (SELECT 7 as HOUR, 0) 
    UNION (SELECT 8 as HOUR, 0) 
    UNION (SELECT 9 as HOUR, 0) 
    UNION (SELECT 10 as HOUR, 0) 
    UNION (SELECT 11 as HOUR, 0) 
    UNION (SELECT 12 as HOUR, 0) 
    UNION (SELECT 13 as HOUR, 0) 
    UNION (SELECT 14 as HOUR, 0) 
    UNION (SELECT 15 as HOUR, 0) 
    UNION (SELECT 16 as HOUR, 0) 
    UNION (SELECT 17 as HOUR, 0) 
    UNION (SELECT 18 as HOUR, 0) 
    UNION (SELECT 19 as HOUR, 0) 
    UNION (SELECT 20 as HOUR, 0) 
    UNION (SELECT 21 as HOUR, 0) 
    UNION (SELECT 22 as HOUR, 0) 
    UNION (SELECT 23 as HOUR, 0) 
) 
AS `combined_table` 
GROUP BY HOUR 
ORDER BY HOUR DESC 

वांछित के रूप में एक MySQL क्वेरी।

8

एकल स्तंभ के साथ एक और तालिका बनाएँ,

CREATE TABLE hours_list (
    hour int NOT NULL PRIMARY KEY 
) 

24 घंटे के साथ भरें।

फिर ज़ीरो भरने के लिए उस तालिका में शामिल हों।

SELECT 
    hs.hour as HOUR, COUNT(ws.ID) AS HOUR_STAT 
FROM hours_list hs 
LEFT JOIN cms_webstat ws ON hs.hour = hour(ws.TIMESTAMP_X) 
GROUP BY hs.hour 
ORDER BY hs.hour DESC 
3

यह सिर्फ 'क्यों नहीं लौटा रहा है' भाग है। मार्कस के जवाब में 'कैसे करें' भाग शामिल है।

एसक्यूएल

SELECT 
    hour(TIMESTAMP_X) as HOUR 
    , count(*) AS HOUR_STAT 
FROM cms_webstat 
GROUP BY HOUR 
ORDER BY HOUR DESC 

प्रति घंटे के रिकॉर्ड की गिनती, टेबल

यह क्या तालिका में मौजूद नहीं है का ब्यौरा नहीं देता में मौजूद टाइम स्टाम्प्स के लिए हो जाता है। चूंकि 8 (आपके उदाहरण से) के अनुरूप टाइमस्टैम्प के लिए कोई रिकर्स नहीं है, इसलिए SQL कोई रिकॉर्ड नहीं लौटाता है।

0
$sql = 'SELECT g, MAX(v) AS v, MAX(c) AS c FROM ('; 
$sql .= '(SELECT DATE_FORMAT(viewed, \'%d.%m.%Y\') AS g, COUNT(1) AS v, 0 AS c FROM '.$this->prefix.'view WHERE campaignid IN ('.join(', ',$ids).') GROUP BY g)'; 
$sql .= ' UNION (SELECT DATE_FORMAT(clicked, \'%d.%m.%Y\') AS g, 0 AS v, COUNT(1) AS c FROM '.$this->prefix.'clicks WHERE campaignid IN ('.join(', ',$ids).') GROUP BY g)'; 
$today = strtotime("00:00:00"); 
for ($i=$today; $i>=time()-30*86400; $i-=86400) { 
    $sql .= ' UNION (SELECT \''.date('d.m.Y',$i).'\' AS g, 0 AS v, 0 AS c)'; 
} 
$sql .= ') AS tmp GROUP BY g ORDER BY g DESC'; 

$chart = DB::getAll($sql); 
p($chart); 

धन्यवाद! इसे बनाया! 2 टेबल, क्लिक और विचारों से, काम किया .. काम करता है। ajaxel.com

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