php - SQL Order By - 条件不起作用

标签 php mysql

概述

我有两个表 - 一个包含论坛主题,另一个包含用户按 ID 对每个主题进行的投票(值为 1 或 -1)。

我有一个算法,适用于所有 14 天以内的帖子,还有一个 SQL 查询来检索所有帖子的投票总数 vote、算法得分总 score、他们的 ID id 以及发布的时间戳。

查询

SELECT t.`id`, 
SUM(v.`vote`) AS vote,
(((100 - ( (UNIX_TIMESTAMP(NOW()) - t.`timestamp`) / (14*60*60*24) * 100)) * (SUM(v.`vote`) + 10)) + SUM(v.`vote`)) AS score

FROM `community_topics` t

LEFT JOIN `community_votes` v
ON v.`topic_id` = t.`id`

GROUP BY t.`id`

ORDER BY CASE
    WHEN t.`timestamp` >= UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 14 DAY)) 
    THEN score DESC 
    ELSE vote DESC, t.`timestamp` DESC 
END

问题

但是,最后一行不起作用:

ORDER BY CASE
    WHEN t.`timestamp` >= UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 14 DAY)) 
    THEN score DESC 
    ELSE vote DESC, t.`timestamp` DESC 
END

这应该按算法分数对 14 天以内的帖子进行排序,按投票分数和时间戳对 14 天以上的帖子进行排序。

我看到的错误是:

#1064 - 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 'DESC, t.`timestamp` END DESC LIMIT 0, 30' at line 9

为什么这不起作用,或者是否有更简单的方法来实现此目的?

最佳答案

您应该将SORT TYPE放在case语句的末尾,例如:

ORDER BY CASE
    WHEN t.`timestamp` >= UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 14 DAY)) 
    THEN score
    ELSE vote
    END DESC, 
t.`timestamp` DESC 

关于php - SQL Order By - 条件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33167560/

相关文章:

php - 无法将 mysql 时间戳映射到elasticsearch

php - 更改 WordPress SQL 数据库以自定义帖子类型

mysql查询选择行分组依据

mysql - 查询从每个问题的答案集中选择已回答所有问题的用户

php - 不能用jquery设置label标签的html吗?

javascript - 如何将 php 添加到 url?

php - 在 MySQL 中将一行的列连接为单个输出

php - 我试图在我的 View 上显示从数据库获取的数据,但我无法显示它。 Laravel 10.x/

javascript - Ajax POST 使用 PHP 保存 JSON 本地文件

mysql - 调用嵌套函数时截断不正确的日期值