Rozumiem że pytasz czy każdą z tych czynności da się zrobić jednym zapytaniem. Bo trudno jest mi sobie wyobrazić zapytanie, które robiłoby to wszystko naraz. Chyba że jest to zapytanie typu wywołanie procedury.
Co do pierwszego - jeżeli w tabeli masz tylko te dwa pola to nie widzę możliwości zrobienia tego w jednym zapytaniu, jeśli jednak byłoby coś więcej to z pewnością dałoby się to zrobić. Na przykład gdyby było dodane pole ostatnio typu datetime można byłoby wykorzystywać:
INSERT INTO players(nick,ostatnio) VALUES('tester',now()) ON duplicate KEY UPDATE ostatnio=now();
Oczywiście by to działało musi być ustawiony klucz primary na id i unique na nick. Wtedy last_insert_id ustawiany jest na id wstawionego rekordu niezależnie od tego czy został wykonany insert czy update. Gdyby jednak nie było pola ostatnio, musielibyśmy stosować albo dwa zapytania - insert+select, albo insert ignore, który nie zwraca last_insert_id w przypadku próby powtórzenia klucza unique, albo obejście składniowe w stylu on duplicate key update id=id, które też by nie zwracało last_insert_id gdyby podany nick już w bazie był, bo żadna realna zmiana w rekordzie by nie zaszła i nic do zmiany byśmy nie mieli. Być może jakiś sposób istnieje by to zmieścić w jednym zapytaniu bez dodatkowego pola i jednocześnie dostać id, ale ja go nie znam.
Co do drugiego to sprawa jest prostsza, bo taką dodatkową kolumną jest czas online, który będziemy zwiększać. Czyli klucz unique na parę ( player_id, dzien ) i jeśli chcemy graczowi tester dodać 30 minut to zapytanie
INSERT INTO online( player_id, dzien, czas_online ) VALUES ( 1, date(now()), 30 ) ON duplicate KEY UPDATE czas_online = czas_online + 30;
Zmieniłem tutaj trochę nazwy kolumn by time nie myliło się z funkcją time, a kolumna online z nazwą tabeli online.