0

我有桌子

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 服务器版本相对应的手册,以在第 16 行的 ''to' l DAY ) ) WHEN submitdate >= NOW() - INTERVAL 3 WEEK 附近使用正确的语法

4

1 回答 1

1

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

还有一个问题。您试图在另一个派生表中引用派生表的列。更具体地说,您似乎试图在子选择中引用列和ofcl这是非法的。如果是一个普通的表,那很好,但是由于它是一个虚拟表,查询不知道它的存在,在解析子查询的时候。uq tsquqtsq

无论如何,您似乎对查询所做的事情可能会更简单地重写,例如:

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 对结果进行分组,并为每个组生成计数以及开始和结束日期。

于 2012-11-20T06:50:18.627 回答