Zeilen aus einer Unterabfrage zählen

12

Einfach: Ich möchte die Anzahl der Zeilen aus der Unterabfrage zählen. Beachten Sie, dass der Status ist, ob der Host online ist oder nicht.

Schlechter Code

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

Erklärt

Die erste Abfrage, wenn sie alleine ausgeführt wird, gibt Folgendes zurück:

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

Die zweite eigenständige Abfrage gibt Folgendes zurück:

SELECT COUNT(ip_address) FROM `ports`
17

Frage

Ich würde gerne wissen, wie man diese Liste von 5 IP-Adressen zählt.

Ich habe online nach möglichen Lösungen für dieses einfache Problem gesucht und war nur frustriert, also dachte ich, ich würde die Experten fragen.

rwcommand
quelle

Antworten:

17

Um Ihre unmittelbare Frage zu beantworten, wie Zeilen einer Unterabfrage gezählt werden, lautet die Syntax wie folgt:

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

Die Unterabfrage sollte unmittelbar auf das Schlüsselwort FROM folgen. (In MySQL ist es auch obligatorisch, einer Unterabfrage dieser Art einen Namen zuzuweisen (sie wird tatsächlich als abgeleitete Tabelle bezeichnet ), weshalb Sie AS some_nameFolgendes sehen können.) So wie Sie es geschrieben haben, interpretiert MySQL Ihr Skript als zwei unabhängige Abfragen, deshalb erhalten Sie zwei Ergebnismengen.

Also, da ist die Unterabfrage in Ihrem Fall

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE

Die vollständige Abfrage würde folgendermaßen aussehen:

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

Aber wie Julien vorgeschlagen hat , können Sie Ihre Anfrage wie folgt umschreiben:

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

Auf diese Weise benötigen Sie überhaupt keine Unterabfrage / abgeleitete Tabelle, da die COUNT-Funktion nur unterschiedliche Vorkommen ip_addressin der portsTabelle zählt.

Andriy M.
quelle
FY: hat auch in Postgres 10 SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; einwandfrei funktioniert : Ich musste das ursprüngliche Konzept des OP verwenden, da ich die Zeilen in einer INTERSECT-Unterabfrage zählen werde.
JL Peyret
6

Sie müssen das verschieben DISTINCTzu COUNT():

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

Dies wird zurückgegeben, 5da nur unterschiedliche Werte gezählt werden und die Unterabfrage nicht mehr benötigt wird.

Diese Abfrage wird jedoch zurückgegeben, 17da die portsTabelle 17 Zeilen enthält :

SELECT COUNT(ip_address) FROM `ports`;

Siehe diese SQL-Geige .

Beispieldaten mit 17 Zeilen und 5 verschiedenen IPs:

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');
Julien Vavasseur
quelle