2011-09-18 61 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

相關問題