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 構文にエラーがあります。''to' l DAY ) ) WHEN submitdate >= NOW() - INTERVAL 3 WEEK ' at line 16 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

4

1 に答える 1

1

CASE は、スカラー式に評価されるはずです。つまり、その THEN 句もスカラー式に評価される必要があります。さて、これは何c 'to' lを表しているのでしょうか?スカラー式ですか?私にはそうは思えませんが、MySQL について知らないことがあるかもしれないので、MySQL 自体がそれをスカラー式として認識しているかどうかがより重要です。そして、明らかにそうではありません。

別の問題があります。別の派生テーブル内で派生テーブルの列を参照しようとしています。より具体的には、副選択の列clの参照を試みているようですが、それは違法です。通常のテーブルであれば問題ありませんが、仮想テーブルであるため、クエリはその時点、つまりサブクエリの解析時にその存在を知りません。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 に答える