하위 쿼리에서 행 개수 SELECT DISTINCT ip_address FROM

단순 : 하위 쿼리의 행 수를 계산하고 싶습니다. 참고 상태가 호스트가 온라인인지 여부입니다.

잘못된 코드

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

설명

자체적으로 실행될 때 첫 번째 쿼리는 다음을 반환합니다.

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

자체적으로 실행되는 두 번째 쿼리는 다음을 반환합니다.

SELECT COUNT(ip_address) FROM `ports`
17

질문

5 개의 IP 주소 목록을 계산하는 방법을 알고 싶습니다.

나는이 간단한 문제에 대한 가능한 해결책을 온라인으로보고 좌절감을 느꼈기 때문에 전문가에게 물어볼 것이라고 생각했습니다.



답변

하위 질문의 행을 계산하는 방법에 대한 즉각적인 질문에 대답하기 위해 구문은 다음과 같습니다.

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

하위 쿼리는 FROM 키워드 바로 뒤에 와야합니다. (MySQL에서는 이런 종류의 하위 쿼리 (실제로 파생 테이블 이라고 함)에 이름을 지정해야 AS some_name합니다. 따라서 다음과 같은 이름을 볼 수 있습니다 .) 작성한 방식에 따라 MySQL은 스크립트를 다음과 같이 해석합니다. 두 개의 독립적 인 쿼리이므로 두 개의 결과 집합을 얻게됩니다.

따라서 귀하의 경우 하위 쿼리는

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE

전체 쿼리는 다음과 같습니다.

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

그러나 Julien이 제안한 것처럼 다음과 같이 쿼리를 다시 작성할 수 있습니다.

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

이 방법으로 COUNT 함수는 테이블 ip_address에서 고유 한 항목 만 계산하므로 서브 쿼리 / 유래 테이블이 전혀 필요하지 않습니다 ports.


답변

를 다음으로 이동해야 DISTINCT합니다 COUNT().

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

5별개의 값만 계산하고 하위 쿼리는 더 이상 필요하지 않기 때문에 반환 됩니다.

그러나이 쿼리는 테이블에 1717 개의 행이 있기 때문에 반환됩니다 ports.

SELECT COUNT(ip_address) FROM `ports`;

SQL Fiddle을 참조하십시오 .

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');


답변