对于我遇到的问题,以下数据库模型是相关的:商店的评分为零或更多。评级包含零个或多个消息。这意味着一个等级具有外键store_id,而一条消息则具有外键rating_id。

我们曾经查询过所有按其状态(已读和未读)排序的等级,其次是根据其创建的时间戳排序的:

// currenty query with simple order by
SELECT *
FROM rating rating
WHERE rating.store_id = $storeId
ORDER BY status DESC, created_timestamp DESC;


现在,我们要考虑评级消息。消息的评级应根据最新消息的created_timestamp以及该消息的状态(已读与未读)进行排序。我想在单个查询中选择所有评分(有无消息)。

我什至很难将问题抽象为众所周知的问题集。有人可以指出我正确的方向吗?



更新

在Barmar的帮助下,我创建了以下查询:

SELECT *
FROM rating r
LEFT JOIN (SELECT m.rating_id, m.created_timestamp, m.status
           FROM messages m
           JOIN (SELECT rating_id, MAX(created_timestamp) maxtime
                 FROM messages
                 GROUP BY rating_id) mmax
           ON m.rating_id = mmax.rating_id AND m.created_timestamp = mmax.maxtime) m
ON m.rating_id = r.id
ORDER BY m.status DESC, m.created_timestamp DESC


但是,该解决方案有两个问题:


当评分没有关联的消息时,它不处理这种情况(在这种情况下,我希望按评分本身的状态和created_timestamp进行排序)
我不明白为什么我需要进行两次联接才能获得每条消息的最新评级

最佳答案

SELECT *
FROM rating r
LEFT JOIN (SELECT m.store_id, m.created_timestamp, m.status
           FROM messages m
           JOIN (SELECT store_id, MAX(created_timestamp) maxtime
                 FROM messages
                 GROUP BY store_id) mmax
           ON m.store_id = mmax.store_id AND m.created_timestamp = mmax.maxtime) m
ON m.store_id = r.store_id
ORDER BY m.status DESC, m.created_timestamp DESC

关于mysql - MySQL:ORDER BY,它使用自己的属性或最新关联对象的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17830146/

10-12 16:19