[php]jak poprawić funkcję usuwania czasowego


(batmomobil) #1

Witam usiłuję poprawić funkcję usuwania czasowego z bazy wpisów z czata

public static function getUsers(){
		if($_SESSION['user']['name']){
			$user = new ChatUser(array('name' => $_SESSION['user']['name']));
			$user->update(); 
		};
		DB::query("DELETE FROM webchat_lines WHERE ts< SUBTIME(NOW(),'0:5:0')");
		DB::query("DELETE FROM webchat_users WHERE last_activity< SUBTIME(NOW(),'0:10:0')");
		
		$result = DB::query('SELECT * FROM webchat_users ORDER BY name ASC LIMIT 18');
		
		$users = array();
		while($user = $result->fetch_object()){
			$user->gravatar = Chat::gravatarFromHash($user->gravatar,30);
			$users[] = $user;
		}
	
		return array(
			'users' => $users,
			'total' => DB::query('SELECT COUNT(*) as cnt FROM webchat_users')->fetch_object()->cnt
		);
	}

zapytanie 

DB::query("DELETE FROM webchat_lines WHERE ts< SUBTIME(NOW(),'0:5:0')"); usuwa czasowo ale wszystkie,a chcę aby zostały id ostatnie 10,coś w stylu id>10.

(Drobok) #2
DELETE FROM `webchat_lines` WHERE id NOT IN (SELECT `id` FROM `webchat_lines` ORDER BY `id` DESC LIMIT 10) AND ts< SUBTIME(NOW(),'0:5:0')

Coś w ten deseń powinno działać, weź też poprawkę że w wypadku większej ilości użytkowników lżej dla serwera będzie aktualizować listę użytkowników i usuwać wiadomości za pomocą crona. (mógłbyś zapisać last_id w tabeli tymczasowej zamiast tak łączyć zapytania)


(batmomobil) #3

Poprawiłem tak zapytanie 

DB::query("DELETE FROM webchat_lines WHERE id NOT IN (select `id` from (SELECT `id` FROM `webchat_lines` ORDER BY `id` DESC LIMIT 10)t) and ts< SUBTIME(NOW(),'0:5:0')"); i działa,dzięki za pomoc ;)

(batmomobil) #4

Dzięki za pomoc,chyba,że jakieś sugestie???