하위 쿼리에서 행 개수


14

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

잘못된 코드

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 주소 목록을 계산하는 방법을 알고 싶습니다.

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

답변:


18

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

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.


FY : Postgres 10에서도 잘 작동했습니다 SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; .INTERSECT 하위 쿼리에서 행을 계산하기 때문에 OPs 독창적 인 개념을 사용해야했습니다.
JL Peyret

6

를 다음으로 이동해야 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');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.