纠正我的MySQL查询?

时间:2012-11-20 06:07:47

标签: mysql sql

我有像

这样的表格
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。

我收到以下错误:

  

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在''到'l附近使用正确的语法   天 ) )       提交日期> =现在() - 间隔3周                  '在第16行

1 个答案:

答案 0 :(得分:1)

CASE应该评估为标量表达式。这意味着它的THEN子句也必须评估标量表达式。现在,这个c 'to' l代表什么?它是标量表达式吗?它对我来说似乎不是一个,但是我可能不知道MySQL中的某些东西,所以更重要的是MySQL本身是否将其识别为标量表达式。显然它没有。

还有另一个问题。您正尝试在另一个派生表中引用派生表的列。更具体地说,您似乎试图引用c l子选项中的uq tsquq,这是非法的。如果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 ; 子查询时。

无论如何,您对查询的看法可能会更简单地重写,例如:

survey

子查询将代理周ID分配给{{1}}的每一行。主查询按照这些ID对结果进行分组,并生成计数以及开始&amp;每个小组的结束日期。