0

メッセージング システムを構築しており、各送信者から指定された受信者への最後のメッセージのみを抽出する必要があります。したがって、3 人がそれぞれ 5 つのメッセージ (合計 15 メッセージ) を受信者に送信した場合、3 つのエントリを取得する必要があります。各送信者からの最後のメッセージ。

これが私の現在のSQLです:

SELECT  
                        messages.*, 
                        user_accounts.uacc_id,
                        user_accounts.uacc_username,
                        user_profiles.upro_image_name
                    FROM messages
                        LEFT JOIN user_accounts 
                            ON messages.msg_from_uacc_fk = user_accounts.uacc_id
                        LEFT JOIN user_profiles 
                            ON user_profiles.upro_uacc_fk = user_accounts.uacc_id
                    WHERE 
                        messages.msg_to_uacc_fk = ?
                    ORDER BY 
                        msg_id
                    DESC

'MAX(1)' を SELECT に追加し、'LIMIT = 1' を DESC の後に追加しようとしましたが、もちろん、これは合計 1 つのメッセージを返しました。

4

2 に答える 2

2

テーブルがどのように設計されているかを推測するのは難しい場合がありますが、以下のこのクエリでは、サブクエリを使用して各ユーザーの最新のメッセージを取得しています。

SELECT  a.*, 
        c.uacc_id,
        c.uacc_username,
        d.upro_image_name
FROM    messages a
        INNER JOIN
        (
            SELECT  msg_from_uacc_fk, MAX(msg_id) max_id
            FROM    messages 
            GROUP   BY msg_from_uacc_fk
        ) b ON  a.msg_from_uacc_fk = b.msg_from_uacc_fk AND
                a.msg_id = b.max_id
        INNER JOIN user_accounts c
            ON  a.msg_from_uacc_fk = c.uacc_id
        INNER JOIN user_profiles d
            ON d.upro_uacc_fk = c.uacc_id
WHERE   a.msg_to_uacc_fk = ?

これで問題が解決しない場合は、質問とともにサンプル レコードを追加してください:)

于 2013-03-11T05:11:13.323 に答える
1

単純に group by を使用することはできませんか?

SELECT u.uacc_username, max(m.msg_id) as LatestMsg
FROM messages m JOIN user_accounts u on m.msg_from_uacc_fk = u.uacc_id
WHERE m.msg_to_uacc_fk = ?
GROUP BY u.uacc_username
于 2013-03-11T03:57:39.573 に答える