Conteggio delle righe da una sottoquery


13

Semplice: vorrei contare il numero di righe dalla query secondaria. Si noti che lo stato indica se l'host è online o meno.

Codice errato

SELECT COUNT(ip_address) FROM `ports` (
    SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)

spiegato

La prima query, quando eseguita da sola, restituisce questo:

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

La seconda query eseguita da sola restituisce questo:

SELECT COUNT(ip_address) FROM `ports`
17

Domanda

Vorrei sapere come contare quell'elenco di 5 indirizzi IP.

Ho cercato online possibili soluzioni a questo semplice problema e mi sono solo frustrato, quindi ho pensato di chiedere agli esperti.

Risposte:


18

Per rispondere alla tua domanda immediata, come contare le righe di una sottoquery, la sintassi è la seguente:

SELECT COUNT(*) FROM (subquery) AS some_name;

La sottoquery dovrebbe immediatamente seguire la parola chiave FROM. (In MySQL è anche obbligatorio assegnare un nome a una sottoquery di questo tipo (in realtà si chiama tabella derivata ), motivo per cui è possibile vederlo come AS some_namesegue.) Come lo hai scritto, MySQL interpreta il tuo script come due query indipendenti, ecco perché ottieni due set di risultati.

Quindi, poiché la subquery nel tuo caso è

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE

la query completa sarebbe simile a questa:

SELECT COUNT(*) FROM (
    SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
) AS derived;

Ma, come ha suggerito Julien , puoi riscrivere la tua query in questo modo:

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

In questo modo non è necessaria alcuna tabella secondaria / derivata, poiché la funzione COUNT conterà solo occorrenze distinte ip_addressnella portstabella.


FY: ha funzionato perfettamente anche in Postgres 10: SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; ho dovuto usare il concetto originale di OP perché conterò le righe in una sottoquery INTERSECT.
JL Peyret,

6

È necessario spostare il DISTINCTin COUNT():

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

Questo ritorna 5perché conta solo valori distinti e la sottoquery non è più necessaria.

Tuttavia, questa query restituisce 17perché ci sono 17 righe nella portstabella:

SELECT COUNT(ip_address) FROM `ports`;

Vedi questo violino SQL .

Dati di esempio con 17 righe e 5 IP distinti:

CREATE TABLE ports (ip_address varchar(20));

INSERT INTO `ports`(ip_address) VALUES
  ('192.168.1.1')
  , ('192.168.1.1')
  , ('192.168.1.1')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.251')
  , ('192.168.1.251')
  , ('192.168.1.251')
  , ('192.168.1.254')
  , ('192.168.1.254')
  , ('192.168.1.254');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.