Bir alt sorgudan satır sayma


14

Basit: Alt sorgudan satır sayısını saymak istiyorum. Not durum konak çevrimiçi olup olmadığıdır.

Hatalı kod

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

Açıklaması

İlk sorgu, kendi başına çalıştırıldığında şunu döndürür:

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

Kendi başına çalıştırılan ikinci sorgu bunu döndürür:

SELECT COUNT(ip_address) FROM `ports`
17

Soru

5 IP adresi listesinin nasıl sayılacağını bilmek istiyorum.

Bu basit soruna olası çözümlere çevrimiçi bakıyordum ve sadece hayal kırıklığına uğradım, bu yüzden uzmanlara soracağımı düşündüm.


Sidenote, WHERE status IS TRUEkısaltılabilirWHERE status
Lennart

Yanıtlar:


19

Hemen sorunuzu cevaplamak için, bir alt sorgunun satırlarını nasıl sayacağınız sözdizimi aşağıdaki gibidir:

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

Alt sorgu hemen FROM anahtar sözcüğünü izlemelidir. (MySQL'de bu tür bir alt sorguya (aslında türetilmiş bir tablo denir ) bir ad atamak da zorunludur , bu yüzden AS some_nameaşağıdakileri görebilirsiniz .) MySQL, yazdığınız şekilde komut dosyanızı şu şekilde yorumlar: iki bağımsız sorgu, bu yüzden iki sonuç kümesi alıyorsunuz.

Yani, davanızdaki alt sorgu

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE

sorgunun tamamı şuna benzer:

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

Ancak, Julien'in önerdiği gibi, sorgunuzu aynı şekilde yeniden yazabilirsiniz:

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

DISTINCT anahtar kelime ile COUNT fonksiyonu sadece farklı oluşumlarını saymasıdır yolu, her bir alt sorgu / türetilmiş tablo gerekmez ip_addressiçinde portsmasaya.


FY: Postgres 10'da da gayet iyi çalıştı: SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; OP'nin orijinal konseptini kullanmak zorunda kaldım çünkü INTERSECT alt sorgusundaki satırları sayacağım.
JL Peyret

6

Sen hareket etmelidir DISTINCTiçin COUNT():

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

Bu, 5yalnızca farklı değerleri saydığı ve artık alt sorguya gerek olmadığı için geri döner .

Ancak bu sorgu 17, portstabloda 17 satır olduğu için döndürülür :

SELECT COUNT(ip_address) FROM `ports`;

Bu SQL Fiddle'a bakın .

17 sıralı ve 5 farklı IP'li örnek veriler:

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');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.