SQL查询:按两列最多排序

时间:2017-04-19 18:09:33

标签: mysql sql-order-by

我已经尝试了十几种不同的方法来解决这个问题,我尝试的一切都打破了我的查询...我有以下代码用于在留言板上生成一个线程循环:< / p>

SELECT MB_TOPICS.*, MAX(MB_REPLIES.TIMESTAMP) AS LATEST 
FROM MB_TOPICS
LEFT JOIN MB_REPLIES
ON MB_TOPICS.TOPIC_ID = MB_REPLIES.TOPIC_ID
WHERE MB_TOPICS.CATEGORY_ID='$CATEGORY'
GROUP BY MB_TOPICS.TOPIC_ID
ORDER BY MB_TOPICS.STICKY DESC, LATEST DESC, MB_TOPICS.TIMESTAMP DESC
LIMIT $start,$limit";

这基本上是拉动了该类别中的所有主题,然后通过连接,它还从回复表中获取最近回复的时间戳(如果有的话)。

在排序上,我想将最近活动的线程保持在最顶层...当前(在粘贴Y / N之后)它按最近的回复排序,然后按创建线程时的时间戳排序...这是错误的,因为这意味着在带有回复的旧线程之后会出现一个新线程。我尝试过像

这样的事情
GREATEST(LATEST, MB_TOPICS.TIMESTAMP)

或使用IIF语句,ORDER BY中的CASE语句等,但我所做的只是打破查询,以便不显示任何结果。我只是想这样做,以便无论哪个时间戳是最近的(最后一个回复或主题创建),它都会对该最大值进行降序排序。我知道这一定很简单,但它今天杀了我。谢谢!

编辑:如果这里有用的信息......最新&#39;对于没有回复的线程,列将为null

1 个答案:

答案 0 :(得分:1)

好的,我终于明白了。我不得不再次使用MAX()函数而不是别名,并且合并处理空值,结合RiggsFolly建议将其作为新列拉出来,导致这个有效的查询:

"SELECT MB_TOPICS.*, MAX(MB_REPLIES.TIMESTAMP) AS LATEST, 
        GREATEST(COALESCE(MAX(MB_REPLIES.TIMESTAMP),0), MB_TOPICS.TIMESTAMP) AS SORT_ORDER
FROM MB_TOPICS
    LEFT JOIN MB_REPLIES ON MB_TOPICS.TOPIC_ID = MB_REPLIES.TOPIC_ID
WHERE MB_TOPICS.CATEGORY_ID='$CATEGORY'
GROUP BY MB_TOPICS.TOPIC_ID
ORDER BY MB_TOPICS.STICKY DESC, SORT_ORDER DESC
LIMIT $start,$limit";

谢谢,如果没有这里的讨论,我就不会到那里。