ORDER BY / CASE组合导致MySQL查询失效

时间:2011-05-20 00:47:00

标签: php mysql sql sql-order-by

以下查询返回空白页面。它是由ORDER BY和CASE组合引起的,因为查询的其余部分可以很好地处理不那么复杂的事情。

有没有人在这部分中看到任何明显的错误:

ORDER BY CASE 
           WHEN s.datesubmitted > DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN s.points 
           WHEN s.datesubmitted < DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN most_recent 
         END, DESC 

代码:

$sqlStr = "SELECT s.loginid, s.title, s.url, s.displayurl, s.points, s.datesubmitted, l.username,
                  s.submissionid, s.subcheck, s.topten, COUNT(c.commentid) countComments, 
                  GREATEST(s.datesubmitted, COALESCE(MAX(c.datecommented), s.datesubmitted)) AS most_recent
             FROM submission s
             JOIN login l ON s.loginid = l.loginid
        LEFT JOIN comment c ON s.submissionid = c.submissionid
         GROUP BY s.submissionid
         ORDER BY CASE 
                    WHEN s.datesubmitted > DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN s.points 
                    WHEN s.datesubmitted < DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN most_recent 
                  END, DESC                  
            LIMIT $offset, $rowsperpage";

2 个答案:

答案 0 :(得分:4)

非常确定ENDDESC之间的逗号不正确。如果您担心CASE语法混乱,您可以尝试将整个ORDER BY表达式括在括号中。

我会把这个大而混乱的表达式放在选择列表中,然后才对它进行排序?您是否有理由无法更改选择列表?

答案 1 :(得分:2)

在“案例”陈述之后,你想要它没有逗号:

ORDER BY CASE
      WHEN s.datesubmitted > DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN s.points
      WHEN s.datesubmitted < DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN most_recent
END DESC

或者,为了更好地理解它,你可以用parens包围它......

ORDER BY (CASE
      WHEN s.datesubmitted > DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN s.points
      WHEN s.datesubmitted < DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN most_recent
END) DESC

...所以它就像一个列,然后在指定您想要按降序排序之后放置'DESC'关键字..(不需要逗号)