Комбинация ORDER BY / CASE приводит к тому, что MySQL-запрос не работает - PullRequest
0 голосов
/ 20 мая 2011

Приведенный ниже запрос возвращает пустую страницу.Это вызвано комбинацией 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 ]

4 голосов
/ 20 мая 2011

Почти уверен, что запятая между END и DESC неверна. Вы можете попробовать заключить все выражение CASE в скобки, если беспокоитесь о том, что ORDER BY запутывает синтаксис.

Я бы поместил это большое запутанное выражение в список выбора и просто упорядочил бы это, правда? Есть ли причина, по которой вы определенно не можете изменить список выбора?

2 голосов
/ 20 мая 2011

Вы хотите без запятой после выражения '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

Или, чтобы лучше понять, вы могли бы окружить его паренсом ...

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' после того, как оно обозначает, что вы хотите упорядочить в порядке убывания .. (запятая не нужна)

...