对于我遇到的问题,以下数据库模型是相关的:商店的评分为零或更多。评级包含零个或多个消息。这意味着一个等级具有外键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/