计算子查询中的行数

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_addressports表中。


Jul*_*eur 8

你必须移动DISTINCTCOUNT()

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)