我已经尝试了十二种不同的方法来解决此问题,而我尝试的一切都打破了我的查询...我有以下代码用于在留言板上生成线程循环:
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语句等,但是我所做的只是中断查询,因此不会出现任何结果。我只想这样做,以便无论哪个时间戳是最新的(最后的答复或主题创建),它都以该最大值为降序排列。我知道这一定很简单,但今天却要杀了我。谢谢!
编辑:如果这里有帮助信息...对于没有回复的线程,“最新”列为空...
最佳答案
好,我终于明白了。我不得不再次使用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";
谢谢,如果没有这里的讨论,我不会到达那里。