2011-09-18 60 views
0

我有一个按钮,将删除适合这个查询所有用户:选择表,并插入到另一个数据 - 数据乘以-sql

DELETE FROM users WHERE lastlogin < ".time()." - ".$sdata['activitylimit']."*3600 

虽然,我必须考虑每个用户的某些部分数据,并把它放到另一个表(“用户名”和“电子邮件”)

我怎样才能从表用户,并将其插入到我的表“reserved_data”?

表reserved_data看起来是这样的:

id (just the id) 
data (the email or username value) 
type (what type of data is it((username/email))) 

回答

0

你不能直接这样做,由于reserved_data表的表布局。你为什么这样做?为什么你没有得到deleted_users表,包含他们的用户名和电子邮件?这样,你可以这样做:

$q1 = "INSERT INTO deleted_users (username, email) SELECT username, email FROM users WHERE lastlogin < (".time()." - ".$sdata['activitylimit']." * 3600)"; 

$q2 = "DELETE FROM users WHERE lastlogin < (".time()." - ".$sdata['activitylimit']." * 3600)"; 

如果你不改变表,使用这样的:你看后者

$toDelete = mysql_query("SELECT username, email FROM users WHERE lastlogin < (".time()." - ".$sdata['activitylimit']." * 3600)"); 

while($user = mysql_fetch_assoc($toDelete)) 
{ 
    mysql_query("INSERT INTO reserved_data (`data`, `type`) VALUES ('" . $user['username'] . ", 'username'"); 
    mysql_query("INSERT INTO reserved_data (`data`, `type`) VALUES ('" . $user['email'] . ", 'email'"); 
} 

// Now perform the delete 
mysql_query("DELETE FROM users WHERE lastlogin < (".time()." - ".$sdata['activitylimit']." * 3600)"); 

需要更多的代码,通常是一个坏主意。你失去了用户名和它的电子邮件地址之间的关系。

另外,您可能希望使用事务,因为可能不会将其包含在第一个查询中,而是包含在第二个查询中。您然后失去此用户的数据。

也许你可以通过简单地将(in)active列添加到用户表中来解决所有问题。一个很少要真的delete数据。

+0

非常感谢。我现在用桌子了解问题。我遵循你的建议,并与deleted_users表一起去。现在看起来更符合逻辑。非常感谢! –

+0

不客气。请注意编辑,您可能想要“停用”用户,这很容易通过添加指示用户是否处于活动状态的列来完成。 – CodeCaster

0

此外,您可以使用删除触发器将数据记录到reserved_data表。只需移动您的reserved_data插入即可触发

我不会推荐带删除标记的方法。你不需要它,没有要求恢复被删除的用户,它带来了很多新问题。

+0

在我的情况下,需要存储已删除的用户数据。我在用户经常作弊的业务中。通过记录他们的用户名,电子邮件和IP它有一点帮助。 –

+0

@burnall:你不能说。如果这个网站有一个留言板,它是如何显示由现在删除的用户发布的帖子的?你在删除用户时看到了什么问题,特别是恢复它们,因为这需要一个简单的'update'语句来将'deleted'重新设置为false? – CodeCaster

相关问题