SELECT c.PAIS, count( * ) totpaises FROM tablaIPs INNER JOIN (SELECT u.numero FROM tablausuariosonline u GROUP BY u.numero)t1 ON t1.numero >= tablaIPs.start AND t1.numero <= tablaIPs.end INNER JOIN tablapaises c ON c.name = tablaIPs.cn GROUP BY tablaIPs.cn ORDER BY totpaises DESC
Esta consulta la tengo funcionando y aunque es algo lenta, no lo es tanto. Es importante que tengas indexados los campos que enlazas. Me refiero a c.numero, tablaIPs.start y tablaIPs.end. Observa que añado otro INNER JOIN con una tablapaises donde tengo los nombres de los países en español. Esta es la idea. Lo que no entiendo en tu consulta es el LEFT JOIN, que seguro que la ralentiza demasiado y no comprendo su función.
Intenta adaptar la consulta incluyendo los nombres de tus campos.
Te quito el último INNER JOIN
Código SQL:
Ver originalSELECT tablaIPs.country, COUNT( * ) totpaises FROM tablaIPs
INNER JOIN (SELECT u.numero FROM tablausuariosonline u GROUP BY u.numero)t1
ON t1.numero >= tablaIPs.START AND t1.numero <= tablaIPs.END
GROUP BY tablaIPs.cn ORDER BY totpaises DESC
No olvides indexar los start y end.