对于我遇到的问题,以下数据库模型是相关的:商店有零个或多个评级。评级有零个或多个消息。这意味着评级具有外键 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 对其进行排序)
- 我不明白为什么我需要进行两次连接才能获得每条消息的最新评级