2013-03-12 86 views
1

我在MySQL數據庫a_ad_display表格式如下如何使用UNION ALL查詢獲取這是不是在表中的記錄?

╔═════════════╦═════════╦═════════╦═════════════════════╗ 
║ addisplayId ║ restId ║ clicked ║  displaytime  ║ 
╠═════════════╬═════════╬═════════╬═════════════════════╣ 
║   1 ║ 20707 ║  0 ║ 2013-03-07 10:50:55 ║ 
║   2 ║ 20707 ║  1 ║ 2013-03-07 10:55:55 ║ 
║   3 ║ 20711 ║  1 ║ 2013-03-08 12:50:55 ║ 
║   4 ║ 20712 ║  1 ║ 2013-03-08 01:50:55 ║ 
║   5 ║ 20707 ║  1 ║ 2013-03-08 10:50:55 ║ 
║   6 ║ 20708 ║  1 ║ 2013-03-09 12:50:55 ║ 
║   7 ║ 20707 ║  1 ║ 2013-03-09 09:50:55 ║ 
║   8 ║ 20708 ║  0 ║ 2013-03-10 10:50:55 ║ 
║   9 ║ 20708 ║  0 ║ 2013-03-11 11:50:55 ║ 
║   10 ║ 20707 ║  0 ║ 2013-03-11 12:50:55 ║ 
╚═════════════╩═════════╩═════════╩═════════════════════╝ 

現在我想的是,如果當前的日期是2013年3月12日與過去7天的數據

,以獲取restId記錄然後我想的2013年3月5日的數據顯示,以2013年3月11日

 DISPLAY TIME     CLICKED  count of row(impression) 
March, 05 2013 00:00:00+0000   0  0    
March, 06 2013 00:00:00+0000   0  0 
March, 07 2013 00:00:00+0000   1  2 
March, 08 2013 00:00:00+0000   1  1 
March, 09 2013 00:00:00+0000   1  1 
March, 10 2013 00:00:00+0000   1  1 
March, 11 2013 00:00:00+0000   0  1 

我想忽略timing..just希望把重點放在迄今擷取記錄日期明智 我想獲取記錄與restId = 10707同該日期和打印0中點擊,還行總數爲表日期和點擊該日期,如果沒有在表中,其未來在上週的日期的任何日期沒有記錄,那麼它應該打印的總和以0

我已經在SQL小提琴製作一個虛擬表也行數列應用於此查詢,但它不是working..so任何人都可以請指導我...我知道它很複雜,如果understand..but你對我的problem..then將清除u到從你側的解決方案的任何問題..

以下是我的查詢這不給予適當的數據

select 
    displaytime, 
    sum(impression) as clicked, 
    (count(impression) -1) as impressions 
from (
    select 
    displaytime, 
    a_ad_display.clicked as impression 
    from 
    a_ad_display 
    where 
    a_ad_display.displaytime 
    BETWEEN 
    date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -6 day) 
    AND 
    CONVERT_TZ(CURDATE(),'+00:00','-11:00') 
    and 
    restId=10708 
    group by 
     a_ad_display.displaytime 
    union distinct 
    select 
     CONVERT_TZ(CURDATE(),'+00:00','-11:00'), 0 
    union distinct 
    select 
     date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -1 day), 0 
    union distinct 
    select 
     date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -2 day), 0 
    union distinct 
    select 
     date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -3 day), 0 
    union distinct 
    select 
     date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -4 day), 0 
    union distinct 
    select 
     date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -5 day), 0 
    union distinct 
    select 
     date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -6 day), 0 
) as x 
group by 
    date(displaytime) 
order by 
    displaytime 

請忽略代碼CONVERT_TZ(CURDATE(),'+00:00','-11:00')怎麼一回事,因爲它只是我的日期轉換爲UTC的用戶時區...

這裏是我的SQL小提琴鏈接 http://sqlfiddle.com/#!2/73f07/1

回答

2

此查詢應顯示正確的數據。不是一個「乾淨的」解決方案。如果您確實想要包含沒有數據的日期,則應該使用日曆表替換這些工會。

SELECT IFNULL(z.displaytime, x.displaytime), IFNULL(z.clicked, 0), IFNULL(z.count, 0) FROM 

    (select 
    date(CONVERT_TZ(CURDATE(),'+00:00','-11:00')) AS 'displaytime', 0 AS 'Clicked', 0 AS 'count of row(impression)' 
    union distinct 
    select 
    date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -1 day)), 0, 0 
    union distinct 
    select 
    date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -2 day)), 0, 0 
    union distinct 
    select 
    date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -3 day)), 0, 0 
    union distinct 
    select 
    date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -4 day)), 0, 0 
    union distinct 
    select 
    date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -5 day)), 0, 0 
    union distinct 
    select 
    date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -6 day)), 0, 0) AS x 

LEFT JOIN 

    (SELECT 
    DATE(displaytime) AS 'displaytime', 
    MAX(clicked) AS 'Clicked', 
    COUNT(*) AS 'Count' 
    FROM 
    a_ad_display 
    WHERE (
    displaytime BETWEEN date_add(CURDATE(), interval -6 day) AND CURDATE() 
) AND restId = 10707 
    GROUP BY DATE(displaytime)) AS z 
ON x.displaytime = z.displaytime 
+0

thanx的answer..its worked.but爲什麼這不是一個乾淨的解決方案? – 2013-03-12 08:57:03

1

有可能是一個更清潔的方式,但這應該工作...

select 
    displaytime, 
    sum(clicked) as clicked, 
    sum(impressions) as impressions 
from (
select 
    displaytime, 
    clicked, 
    impressions 
from (
select 
    date(displaytime) as displaytime, 
    sum(impression) as clicked, 
    sum(legit) as impressions 
from (
    select 
    displaytime, 
    a_ad_display.clicked as impression, 
    1 as legit 
    from 
    a_ad_display 
    where 
    a_ad_display.displaytime 
    BETWEEN 
    date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -6 day) 
    AND 
    CONVERT_TZ(CURDATE(),'+00:00','-11:00') 
    and 
    restId=10708 
) as x 
group by 
    date(displaytime) 
) y 
union distinct 
    select 
     date(CONVERT_TZ(CURDATE(),'+00:00','-11:00')), 0, 0 
    union distinct 
    select 
     date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -1 day)), 0, 0 
    union distinct 
    select 
     date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -2 day)), 0, 0 
    union distinct 
    select 
     date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -3 day)), 0, 0 
    union distinct 
    select 
     date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -4 day)), 0, 0 
    union distinct 
    select 
     date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -5 day)), 0, 0 
    union distinct 
    select 
     date(date_add(CONVERT_TZ(CURDATE(),'+00:00','-11:00'), interval -6 day)), 0, 0 
) z 
group by 
    displaytime 
order by 
    displaytime 
1

restID 20707一些其他的解決辦法。對於2013年3月10日也對restID 20707沒有記錄。

查詢SQLFIDDLEExample

SELECT d.Date, 
(SELECT CASE WHEN COUNT(clicked) >0 THEN 1 ELSE 0 END 
FROM a_ad_display 
WHERE DATE(displaytime) = d.Date 
AND clicked = 1 
AND restId = 20707 ) Clicked, 
(SELECT COUNT(*) 
FROM a_ad_display 
WHERE DATE(displaytime) = d.Date 
AND restId = 20707 ) 'count of row' 
FROM 
(SELECT a.Date 
FROM 
    (SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date 
    FROM 
    (SELECT 0 AS a 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 6 
     UNION ALL SELECT 7 
     UNION ALL SELECT 8 
     UNION ALL SELECT 9) AS a CROSS 
    JOIN 
    (SELECT 0 AS a 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 6 
     UNION ALL SELECT 7 
     UNION ALL SELECT 8 
     UNION ALL SELECT 9) AS b CROSS 
    JOIN 
    (SELECT 0 AS a 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 6 
     UNION ALL SELECT 7 
     UNION ALL SELECT 8 
     UNION ALL SELECT 9) AS c) a 
where a.Date >= '2013-01-01' and a.Date < curdate()) d 
WHERE d.Date >= date_add(curdate(), INTERVAL -7 DAY) 
ORDER BY d.Date 

結果:

|       DATE | CLICKED | COUNT OF ROW | 
--------------------------------------------------------- 
| March, 05 2013 00:00:00+0000 |  0 |   0 | 
| March, 06 2013 00:00:00+0000 |  0 |   0 | 
| March, 07 2013 00:00:00+0000 |  1 |   2 | 
| March, 08 2013 00:00:00+0000 |  1 |   1 | 
| March, 09 2013 00:00:00+0000 |  1 |   1 | 
| March, 10 2013 00:00:00+0000 |  0 |   0 | 
| March, 11 2013 00:00:00+0000 |  0 |   1 |