sql >> データベース >  >> RDS >> Mysql

SQLは特定のユーザーとの間で最後のメッセージを取得します

    私はSQLServer2008を使用していますが、使用しているデータベースはわかりません。

    提供した情報から、クエリは必要な出力に対して非常に複雑に見えます。ユーザー36に関連するすべてのメッセージを取得するための簡単なクエリは次のとおりです。

    SELECT  
           sender.msg_user_name AS sender_user_name
           ,recipient.msg_user_name AS recipient_user_name
           ,msg_date
           ,msg_text
    
    FROM    
           dbo.Fed_Messages 
    
           INNER JOIN dbo.Fed_User AS sender 
           ON sender.msg_user_id = sender_user_id
    
           INNER JOIN dbo.Fed_User AS recipient 
           ON recipient.msg_user_id = recipient_user_id
    
    WHERE   
           sender_user_id = 36
           OR recipient_user_id = 36
    
    ORDER BY
           msg_date DESC
    

    SQL Serverの場合、選択した名前の一部は予約語であるため、一部のフィールド名を変更する必要がありました。

    SQLフィドル: http://sqlfiddle.com/#!3/b8e88/1 >

    編集: これで、さらにいくつかの情報が追加され、idがあることが示されました。 メッセージテーブルのフィールドには、次のようなものを使用できます(注:SQL Serverを使用しているため、MySQLのクエリを変更する必要があります):

    SELECT  sender.msg_user_name AS sender_user_name
           ,recipient.msg_user_name AS recipient_user_name
           ,msg_date
           ,msg_text
    FROM    dbo.Fed_Messages
            INNER JOIN dbo.Fed_User AS sender ON sender.msg_user_id = sender_user_id
            INNER JOIN dbo.Fed_User AS recipient ON recipient.msg_user_id = recipient_user_id
            INNER JOIN ( SELECT MAX(id) AS most_recent_message_id
                         FROM   dbo.Fed_Messages
                         GROUP BY CASE WHEN sender_user_id > recipient_user_id
                                       THEN recipient_user_id
                                       ELSE sender_user_id
                                  END -- low_id
                               ,CASE WHEN sender_user_id < recipient_user_id
                                     THEN recipient_user_id
                                     ELSE sender_user_id
                                END -- high_id
                       ) T ON T.most_recent_message_id = dbo.Fed_Messages.id
    WHERE   sender_user_id = 36
            OR recipient_user_id = 36
    ORDER BY msg_date DESC
    

    SELECT FROMで クエリの一部は、最新のメッセージを検索します(idに基づく) 、送信者/受信者のユーザーIDの順序付けられたペアごとに、自動インクリメント番号であると想定しています。その結果は、Fed_Messagesに再結合されます。 送信者/受信者の名前が正しいことを確認するための表。

    更新されたSQLフィドル: http://sqlfiddle.com/#!3/1f07a/2




    1. MySqlテーブル列の1つに一意のランダムな文字列を生成するにはどうすればよいですか?

    2. 値ではなく複数の列で並べ替えるにはどうすればよいですか?

    3. MySQLSum列IFIDが別のテーブルクエリにある

    4. 大量のテキストデータの傾向を見つける