SELECT CAST(up.id AS TEXT) AS userProfileId, u.id AS steamId, CAST(p.id AS TEXT) AS gamePlayerId, COALESCE(up.name, u.name, '') AS displayName, up.fame_points AS famePoints, MAX(CASE WHEN currency.currency_type = 1 THEN currency.account_balance END) AS normalBalance, MAX(CASE WHEN currency.currency_type = 2 THEN currency.account_balance END) AS goldBalance, e.location_x AS x, e.location_y AS y, e.location_z AS z, datetime(p.last_save_time, 'unixepoch') AS lastSaveTime, up.last_login_time AS lastLoginTime, up.last_logout_time AS lastLogoutTime, p.is_alive AS isAlive FROM user_profile up JOIN user u ON u.id = up.user_id LEFT JOIN prisoner p ON p.id = up.prisoner_id LEFT JOIN prisoner_entity pe ON pe.prisoner_id = p.id LEFT JOIN entity e ON e.id = pe.entity_id LEFT JOIN bank_account_registry account ON account.account_owner_user_profile_id = up.id LEFT JOIN bank_account_registry_currencies currency ON currency.bank_account_id = account.id WHERE (:userProfileId IS NULL OR CAST(up.id AS TEXT) = :userProfileId) AND (:steamId IS NULL OR u.id = :steamId) AND (:search IS NULL OR COALESCE(up.name, u.name, '') LIKE '%' || :search || '%') GROUP BY up.id ORDER BY up.last_login_time DESC LIMIT COALESCE(:limit, 500)