0

わかりました、もう一度この質問をしようと思います。私の最後の投稿は、より精巧な質問ではなかったために閉じられたので、より具体的にしようとします.

ユーザーがメッセージを受信すると、メッセージを読んだかどうかにかかわらずクリックしたかどうかに基づいてunread、ステータスがマークされます。read

重複したメッセージを受信したと言うユーザーがいます。問題は、メッセージを追跡するレコードが 2 番目のテーブルにあることです。2つのテーブルは次のようになります

subject_table

id     user_id     message_id        created        status
1      34          81                03/11/12       read
2      34          82                06/15/12       unread
3      34          83                06/16/12       unread
4      35          84                07/10/12       read
5      35          85                07/12/12       unread
6      35          86                07/14/12       unread
7      35          87                07/14/12       unread
8      24          88                08/09/12       read

メッセージテーブル

id     message     
81     'welcome'         
82     'welcome'  //duplicate for user 34, associated table needs to be set to read      
83     'welcome'  //duplicate for user 34, this record needs to be set to read        
84     'welcome'          
85     'welcome'
86     'welcome'
87     'pretty cool' //not a duplicate for user 35
88     'welcome'  // not a duplicate for user 24

この質問が最初の質問と異なるのは、ここに関連するテーブルがあることです。各テーブルを調べて、メッセージが重複しているテーブルのみを更新する必要があります。message_table のレコード 87 を参照してください。重複がないため、無視されます。

したがって、私の質問は、関連するテーブルとの重複に基づいてテーブル 1 を更新する方法です。

[編集]

重複とは、同じメッセージ値を持つメッセージが関連付けられているすべてのユーザーを意味します。例を見てください。user_id34には3つのレコードがあります。for each レコードをmessage_id調べると、同じメッセージ「ようこそ」が 3 回繰り返されていることがわかります。user_idこれは34の重複レコードです

以下は失敗です

UPDATE subject_table
SET `status` = 'read'
WHERE
    user_id IN (
        SELECT
            s.user_id
        FROM
            subject_table s
        INNER JOIN messages m ON m.id = s.message_id
        WHERE
            m.message LIKE '%welcome%'
        GROUP BY
            s.user_id
        HAVING
            count(s.user_id) > 1);

ここでやろうとしているのは、サブクエリで、複数の重複レコードを持つ ID のリストを取得し、関連するレコードのステータスを更新して読み取ることです。しかし、これで発生する問題は次のエラーです

Error : You can't specify target table 'subject_table' for update in FROM clause
4

1 に答える 1

0

user_idメッセージが重複し、すべてが同じである必要があるmessageと仮定するとcreated、次のステートメントでそれを実行する必要があります。

UPDATE subject_table, message_table
SET    subject_table.status = <status>
WHERE  subject_table.message_id = message_table.id
AND    subject_table.user_id = <user-id>
AND    message_table.message = <message>
AND    subject_table.created = <created>

(ここ<user_id>で、、<message>およびは<created>それぞれの列の実際の値のプレースホルダーであり<status>、新しいステータスの値です)

これはマルチテーブルUPDATE構文と呼ばれ、ここで説明されています:http: //dev.mysql.com/doc/refman/5.6/en/update.html

于 2012-10-24T13:20:01.227 に答える