2012-11-20 67 views
0

我有表像更正我的MySQL查詢?

CREATE TABLE `survey` (
    `id` int(11) NOT NULL auto_increment, 
    `submitdate` datetime default NULL, 
`answer` varchar(5) collate utf8_unicode_ci default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=499 ; 

現在得到這樣

c    t   Clicks 
2012-10-29 2012-10-22  10 
2012-11-04 2012-10-30  20 
2012-11-11 2012-11-05  30 
2012-11-19 2012-11-12  34 

我使用此查詢

SELECT uq.timespan, COALESCE(tsq.TotalClicks, 0) as Clicks FROM (
SELECT DATE(DATE_ADD(NOW() , INTERVAL -21 
DAY)) c, DATE(DATE_ADD(NOW() , INTERVAL -28 
DAY)) l 
union SELECT DATE(DATE_ADD(NOW() , INTERVAL -15 
DAY)) c, DATE(DATE_ADD(NOW() , INTERVAL -20 
DAY)) l 
union SELECT DATE(DATE_ADD(NOW() , INTERVAL -8 
DAY)) c, DATE(DATE_ADD(NOW() , INTERVAL -14 
DAY)) l 
union SELECT curdate() c,DATE(DATE_ADD(NOW() , INTERVAL -7 
DAY)) l 
)uq LEFT JOIN (
SELECT CASE 
    WHEN submitdate >= NOW() - INTERVAL 4 WEEK 
       AND submitdate < NOW() - INTERVAL 3 WEEK THEN c 'to' l 
DAY)) 
    WHEN submitdate >= NOW() - INTERVAL 3 WEEK 
       AND submitdate < NOW() - INTERVAL 2 WEEK THEN c 'to' l 
    WHEN submitdate >= NOW() - INTERVAL 2 WEEK 
     AND submitdate < NOW() - INTERVAL 1 WEEK THEN c 'to' l 
DAY)) 
    WHEN submitdate >= NOW() - INTERVAL 1 WEEK THEN c 'to' l 
      END Weeksubmitdate, 
      count(id) TotalClicks 
FROM survey 
WHERE submitdate >= NOW() - INTERVAL 4 WEEK 
GROUP BY Weeksubmitdate 
)tsq ON uq.timespan = tsq.Weeksubmitdate"; 

問題值是16日線c爲L。

我收到以下錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''to' l DAY)) WHEN submitdate >= NOW() - INTERVAL 3 WEEK ' at line 16

回答

1

情況下,應該得出一個標量表達式。這意味着它的THEN子句也必須評估爲標量表達式。現在,這是什麼c 'to' l的東西代表?這是一個標量表達式嗎?對我來說這似乎不是我想要的,但是我可能並不知道MySQL中的一些東西,所以更重要的是,MySQL本身是否認可這是一個標量表達式。顯然它沒有。

還有一個問題。您正試圖在另一個派生表中引用派生表的列。更具體地說,你似乎試圖參照cluqtsq子查詢,這是非法的。如果uq是普通表格,那就沒問題,但由於它是虛擬表格,查詢不知道它在處的存在,即指向,即在解析tsq子查詢時。

無論如何,你似乎在做與您的查詢也許可以更簡單地改寫,這樣,例如:

SELECT 
    MIN(submitdate) AS startdate, 
    MAX(submitdate) AS enddate, 
    COUNT(*) AS clicks 
FROM (
    SELECT 
    CASE 
     WHEN submitdate >= NOW() - INTERVAL 1 WEEK THEN 1 
     WHEN submitdate >= NOW() - INTERVAL 2 WEEK THEN 2 
     WHEN submitdate >= NOW() - INTERVAL 3 WEEK THEN 3 
     WHEN submitdate >= NOW() - INTERVAL 4 WEEK THEN 4 
    END AS weekid, 
    * 
    FROM survey 
) s 
GROUP BY 
    weekid 
ORDER BY 
    startdate 
; 

子查詢指定代理星期ID來的survey每一行。主要查詢按照這些ID對結果進行分組,並生成計數以及爲每個組開始&結束日期。