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.