mysql根据关联表中的数据更新重复记录

时间:2012-10-24 13:08:32

标签: mysql

好的,我打算再次提出这个问题。我的上一篇文章已经结束,因为这不是一个更复杂的问题所以我会尝试更具体。

用户会收到消息,状态会标记为unreadread,具体取决于他们是否点击了他们已阅读过消息的消息。

有用户表示他们已收到重复邮件。问题是跟踪消息的记录在第二个表中。所以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

message_table

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_id 34有3条记录。如果我们查找每条记录的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

1 个答案:

答案 0 :(得分:0)

假设对于要重复的邮件,user_idmessagecreated的所有内容必须相同,则以下语句应执行此操作:

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