私が遭遇した問題については、次のデータベース モデルが関連しています。ストアには 0 個以上の評価があります。評価には 0 個以上のメッセージがあります。つまり、評価には外部キー 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 とそのメッセージのステータス (既読と未読) に応じて順序付けする必要があります。そして、1 つのクエリですべての評価 (メッセージの有無にかかわらず) を選択したいと考えています。
問題をよく知られた問題セットに抽象化することさえ困難です。誰かが私を正しい方向に向けることができますか?
アップデート
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
ただし、そのソリューションには2つの問題があります。
- 評価に関連するメッセージがない場合は処理しません (この場合、評価自体のステータスと created_timestamp によって順序付けしたい)
- 各メッセージの最新の評価を取得するために 2 つの結合を行う必要がある理由がわかりません