Simples: gostaria de contar o número de linhas da subconsulta. Observe que o status é se o host está online ou não.
Código incorreto
SELECT COUNT(ip_address) FROM `ports` (
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)
Explicado
A primeira consulta, quando executada por conta própria, retorna isso:
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
ip_address
192.168.1.1
192.168.1.2
192.168.1.248
192.168.1.251
192.168.1.254
A segunda consulta executada por conta própria retorna isso:
SELECT COUNT(ip_address) FROM `ports`
17
Pergunta
Gostaria de saber como contar essa lista de 5 endereços IP.
Eu tenho procurado on-line possíveis soluções para esse problema simples e estou ficando frustrado, então pensei em perguntar aos especialistas.
Para responder à sua pergunta imediata, como contar linhas de uma subconsulta, a sintaxe é a seguinte:
A subconsulta deve seguir imediatamente a palavra-chave FROM. (No MySQL também é obrigatório atribuir um nome a uma subconsulta desse tipo (na verdade, é chamada de tabela derivada ), e é por isso que você pode ver o
AS some_name
seguinte.) Da maneira que você escreveu, o MySQL interpreta seu script como duas consultas independentes, é por isso que você está obtendo dois conjuntos de resultados.Então, como a subconsulta no seu caso é
a consulta completa ficaria assim:
Mas, como Julien sugeriu , você pode reescrever sua consulta assim:
Dessa forma, você não precisa de uma subconsulta/tabela derivada, porque com a palavra-chave DISTINCT a função COUNT contará apenas ocorrências distintas de
ip_address
naports
tabela.Você deve mover o
DISTINCT
para oCOUNT()
:Isso retorna
5
porque conta apenas valores distintos e a subconsulta não é mais necessária.No entanto, esta consulta retorna
17
porque há 17 linhas naports
tabela:Veja este SQL Fiddle .
Dados de amostra com 17 linhas e 5 IPs distintos:
Ninguém apontou o problema real com o
Bad code
so: Você precisa nomear aSELECT
saída do interno usandoAS some_name
Como já mencionado, o melhor é:
Por quê?
Veja: https://stackoverflow.com/questions/3363918/mysql-error-1248-42000-every-derived-table-must-have-its-own-alias
No MySQL 5.7 você obtém ERROR
"[42000][1248] Every derived table must have its own alias"
semAS some_name
. Com ele, funciona. segundos atrás