Đếm các hàng từ một truy vấn con


13

Đơn giản: Tôi muốn đếm số lượng hàng từ truy vấn phụ. Lưu ý rằng trạng thái là liệu máy chủ có trực tuyến hay không.

Mã xấu

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

Giải thích

Truy vấn đầu tiên, khi tự chạy sẽ trả về điều này:

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

Truy vấn thứ hai tự chạy trả về điều này:

SELECT COUNT(ip_address) FROM `ports`
17

Câu hỏi

Tôi muốn biết làm thế nào để đếm danh sách 5 địa chỉ IP đó.

Tôi đã tìm kiếm trực tuyến các giải pháp khả thi cho vấn đề đơn giản này và cảm thấy thất vọng, vì vậy tôi nghĩ nên hỏi các chuyên gia.

Câu trả lời:


18

Để trả lời câu hỏi ngay lập tức của bạn, cách đếm các hàng của truy vấn con, cú pháp như sau:

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

Truy vấn con phải ngay lập tức theo từ khóa TỪ. (Trong MySQL, bắt buộc phải gán tên cho truy vấn con loại này (nó thực sự được gọi là bảng dẫn xuất ), đó là lý do tại sao bạn có thể thấy AS some_namesau đây.) Cách bạn đã viết nó, MySQL diễn giải kịch bản của bạn như là hai truy vấn độc lập, đó là lý do tại sao bạn nhận được hai tập kết quả.

Vì vậy, vì truy vấn con trong trường hợp của bạn là

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE

truy vấn hoàn chỉnh sẽ như thế này:

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

Nhưng, như Julien đã đề xuất , bạn có thể viết lại truy vấn của mình như thế này:

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

Bằng cách này, bạn hoàn toàn không cần một bảng phụ / bảng dẫn xuất, bởi vì hàm COUNT sẽ chỉ tính các lần xuất hiện riêng biệt ip_addresstrong portsbảng.


FY: cũng hoạt động tốt trong Postgres 10: SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; Tôi đã phải sử dụng khái niệm ban đầu của OP vì tôi sẽ đếm các hàng trong một truy vấn con INTERSECT.
JL Peyret

6

Bạn phải di chuyển DISTINCTđến COUNT():

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

Điều này trả về 5vì nó chỉ tính các giá trị riêng biệt và truy vấn con không còn cần thiết nữa.

Tuy nhiên, truy vấn này trả về 17vì có 17 hàng trong portsbảng:

SELECT COUNT(ip_address) FROM `ports`;

Xem Fiddle SQL này .

Dữ liệu mẫu với 17 hàng và 5 IP riêng biệt:

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');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.