0

私が遭遇した問題については、次のデータベース モデルが関連しています。ストアには 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つの問題があります。

  1. 評価に関連するメッセージがない場合は処理しません (この場合、評価自体のステータスと created_timestamp によって順序付けしたい)
  2. 各メッセージの最新の評価を取得するために 2 つの結合を行う必要がある理由がわかりません
4

2 に答える 2

0
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
于 2013-07-24T09:37:50.660 に答える