1

副選択なしで次のクエリを実行する方法はありますか?

SELECT * FROM 
(
SELECT * FROM messaging_message WHERE recipient_id=4 ORDER BY timestamp DESC
) combined
GROUP BY thread_id HAVING status='unread'

テーブル:

`messaging_message`
 - id
 - thread_id
 - content
 - sender_id
 - recipient_id
 - timestamp
 - status

スレッドIDは、メッセージの親スレッドです。

更新:これまでの2つの回答のテストでは、どちらのクエリも必要な結果を生成していません。

クエリは、メッセージスレッドの最新のメッセージ='unread'である結果のみを返す必要があります。以下の両方のクエリは、ステータス='unread'のメッセージを持つスレッドの最上位の結果を返します。

私がやろうとしているのは、Gmailなどのメールの受信トレイのようなものです。受信トレイの最初のページに25個のスレッドが表示されているとします。status ='unread'の最新のメッセージを持つスレッドのみを強調表示したいと思います(最新のメッセージより古いメッセージのステータスは無視します)。

これがGROUP BY、順序付けられた結果でを使用している理由でもあります。そのため、最新の結果のみを取得し、それらの結果のうち、status='unread'の結果を確認します。

(説明をより明確にするために、上記のクエリのステータスも「削除済み」から「未読」に変更したことに注意してください。)

4

2 に答える 2

3

あなたのクエリはMySQLハックのようなものです。order bySQL標準では、その位置でのを許可していません。MySQLで一貫して機能するかどうかさえわかりません。そうは言っても、あなたのバージョンはかなり明確であり、おそらくより厳密なバージョンよりも優れています。

たとえば、クエリを作成するより公式な方法は次のとおりです。

select  *
from    (
        select  distinct thread_id
        from    messaging_message
        where   recipient_id = 4
        ) thread
join    messaging_message mm
on      mm.id =
        (
        select  mm2.id
        from    messaging_message mm2
        where   thead.thread_id = mm2.thread_id
        order by
                mm2.timestamp desc
        limit   1
        )
where   mm.status = 'unread'
于 2012-06-10T07:31:16.487 に答える
2

明確にするために、あなたはそのメッセージの受信者がuser_id 4である各スレッドで最新の削除されたメッセージの詳細を取得しようとしています...正しいですか?もしそうなら、この質問はあなたがここに投稿したものと似ており、あなたがあなたのメッセージステータステーブルをあなたのメッセージテーブルにマージしたようです(良いです!)。だからここに私の調整された答えがあります:

SELECT 
    b.*
FROM 
    messaging_messagethread a
INNER JOIN 
    messaging_message b ON a.id = b.thread_id
WHERE 
    b.timestamp =
    (
        SELECT MAX(timestamp)
        FROM messaging_message
        WHERE thread_id = a.id
    )
    AND b.status = 'unread'
    AND b.recipient_id = 4

ここでは、相関サブクエリを使用して、各スレッドの最新のメッセージのタイムスタンプを抽出しています。

次に、そのメッセージのステータスが「未読」であるかどうかを確認します。

最後に、WHERE句の3番目の条件では、最後に削除されたメッセージの受信者がuser_id4であるスレッドのみを選択します。

于 2012-06-10T09:22:27.897 に答える