rwc*_*and 21 mysql select mysql-5.5
简单:我想计算子查询中的行数。请注意,状态是主机是否在线。
SELECT COUNT(ip_address) FROM `ports` (
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)
Run Code Online (Sandbox Code Playgroud)
第一个查询在单独运行时返回:
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
Run Code Online (Sandbox Code Playgroud)
SELECT COUNT(ip_address) FROM `ports` (
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)
Run Code Online (Sandbox Code Playgroud)
自行运行的第二个查询返回:
SELECT COUNT(ip_address) FROM `ports`
Run Code Online (Sandbox Code Playgroud)
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
Run Code Online (Sandbox Code Playgroud)
我想知道如何计算 5 个 IP 地址的列表。
我一直在网上寻找这个简单问题的可能解决方案,但感到沮丧,所以我想问问专家。
And*_*y M 30
要回答您的直接问题,如何计算子查询的行数,语法如下:
SELECT COUNT(*) FROM (subquery) AS some_name;
Run Code Online (Sandbox Code Playgroud)
子查询应该紧跟在 FROM 关键字之后。(在 MySQL 中,还必须为此类子查询分配一个名称(它实际上称为派生表),这就是为什么您可以看到AS some_name以下内容。)按照您编写它的方式,MySQL 将您的脚本解释为两个独立的查询,这就是为什么你会得到两个结果集。
因此,由于您的情况下的子查询是
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
Run Code Online (Sandbox Code Playgroud)
完整的查询如下所示:
SELECT COUNT(*) FROM (
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
) AS derived;
Run Code Online (Sandbox Code Playgroud)
但是,正如 Julien 所建议的,您可以像这样重写您的查询:
SELECT COUNT(DISTINCT ip_address) FROM `ports` WHERE status IS TRUE;
Run Code Online (Sandbox Code Playgroud)
这样,你并不需要在所有的子查询/派生表,因为与DISTINCT关键字COUNT函数只会计算的不同出现ip_address在ports表中。
你必须移动DISTINCT到COUNT():
SELECT COUNT(DISTINCT ip_address) FROM `ports`;
Run Code Online (Sandbox Code Playgroud)
这会返回,5因为它只计算不同的值并且不再需要子查询。
但是,此查询返回,17因为ports表中有 17 行:
SELECT COUNT(ip_address) FROM `ports`;
Run Code Online (Sandbox Code Playgroud)
请参阅此SQL 小提琴。
具有 17 行和 5 个不同 IP 的示例数据:
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');
Run Code Online (Sandbox Code Playgroud)