2012-11-20 5 views
0

Je table commeCorriger ma requête 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 ; 

maintenant pour obtenir des valeurs telles que

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 

J'utilise cette requête

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"; 

problème est avec 16 ligne c à l.

Je reçois l'erreur suivante:

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

Répondre

1

CASE est censé évaluer une expression scalaire. Cela signifie que ses clauses THEN doivent aussi être évaluées en expressions scalaires. Maintenant, que représente cette chose c 'to' l? Est-ce une expression scalaire? Cela ne me semble pas, mais je ne suis peut-être pas au courant de certaines choses dans MySQL, donc il est plus important que MySQL le reconnaisse comme une expression scalaire. Et apparemment ce n'est pas le cas.

Il existe un autre problème. Vous essayez de référencer les colonnes d'une table dérivée dans une autre table dérivée. Plus précisément, vous semblez essayer de faire référence aux colonnes c et l de uqà l'intérieur la sous-sélection tsq, ce qui est illégal. Si uq était une table normale, ce serait bien, mais puisqu'il s'agit d'une table virtuelle, la requête ne connaît pas son existence à ce point, c'est-à-dire au moment de l'analyse de la sous-requête tsq.

Quoi qu'il en soit, ce que vous semblez faire avec votre requête pourrait probablement être plus simplement réécrite, comme celui-ci, par exemple:

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 
; 

Le sous-requête attribue les ID de semaine de substitution à chaque rangée de survey. La requête principale regroupe les résultats par ces identifiants et produit les comptages ainsi que les dates de fin de chaque groupe à partir de &.

Questions connexes