MySQL 3表联接和更新

时间:2018-06-21 09:45:16

标签: mysql date join

我正在尝试联接3个表并根据表中的数据更新一些值。

受影响的表和列是:

用户

id |用户注册

成员

user_id |状态

user_meta

user_id |关键值

我基本上想从7天前之前通过user_registered列注册的用户表中获取所有用户,然后将其ID与状态为活动的成员表的user_id结合在一起,然后将其与的user_id结合起来user_meta表,其中键是=“功能”,值是=待定。然后,最后将该值更新为active。

我有以下内容,但我认为这是不正确的,因为它没有将记录分组在一起并且没有加入,并且我不确定语法是否正确:

SELECT u.id, u.user_registered, p.user_id, p.status, um.user_id, um.key, um.value
FROM users u, members p, user_meta um
WHERE u.user_registered < NOW() - INTERVAL 1 WEEK AND p.status = "active" AND um.key='capability' AND value='pending'

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以通过两种方式根据逻辑更新user_meta表。

查询1:

UPDATE user_meta
SET user_meta.value = 'active'
WHERE user_meta.user_id IN
(SELECT id
    FROM (SELECT u.id
        FROM users u JOIN members p ON (u.id = p.user_id)
                             JOIN user_meta um ON (u.id = um.user_id)
                WHERE u.user_registered < NOW() - INTERVAL 1 WEEK
                                     AND p.status = "active"
                                     AND um.key = 'capability'
                                     AND um.value = 'pending'
             )tmp)

查询2:

UPDATE user_meta
  JOIN (SELECT u.id
        FROM users u
          JOIN members p ON (u.id = p.user_id)
          JOIN user_meta um ON (u.id = um.user_id)
        WHERE u.user_registered < NOW() - INTERVAL 1 WEEK
            AND p.status = "active"
            AND um.key = 'capability'
            AND um.value = 'pending') tmp
    ON (tmp.id = user_meta.user_id)
SET user_meta.value = 'active'

如果选择查询的行数很大并且使用 IN 语句对列进行了索引不正确,则查询1将花费很长时间。