我正在使用以下查询从表中删除一些行(用户)

DELETE
FROM
    rfs_users
WHERE
    ID > 1 AND user_registered < '2017-05-16 12:09:54' AND user_login NOT IN ('username1', 'username2')

我有另一个表,我还需要从中删除一些行。这个表(rfs_usermeta)的结构不同,我不能对它使用相同的查询。
rfs_users中,一行对应于一个用户。在rfs_usermeta中,多行对应于一个用户。我可以用
DELETE FROM rfs_usermeta WHERE user_id > 1

但这几乎会删除所有行。如果要在rfs_usermeta中删除用户,我需要在rfs_users中删除该用户。
例如:
// loop rows in rfs_users
for (row in rfs_users) {
    // target specific rows
    if (row.user_id > 1 && row.user_registered < '2017-05-16 12:09:54' && !('username1', 'username2').includes(row.user_login)) {
        // delete matching row
        row.remove()
        // also delete rows from rfs_usermeta
        rfs_usermeta.getRows(row.user_id).remove()
    }
}

如何形成此查询?

最佳答案

usermeta是否对users表有外键约束?如果是这样,您可以设置引用行中发生的事情。
通过将外键约束添加到usermeta中,可以自动删除相应的行,如下所示:

ALTER TABLE usermeta ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;

这将删除引用已删除用户的所有usermeta行。
如果不想这样做,还可以向用户表添加一个触发器,该触发器将删除usermeta行。
希望这有帮助;)

08-04 14:51