2011-03-03 5 views
1

이 select 문을 두뇌로 감싸는 데 문제가 있습니다. 데이터는 (I 쉽게 읽을 수 있도록 모든 불필요한 데이터를 잘라 한) 3 개 테이블에서오고있다 :Mysql : 여러 조인 된 테이블에서 특정 데이터 선택

mysql> describe vulnerability; 
+---------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+---------------+------------------+------+-----+---------+----------------+ 
| vuln_id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| severity  | int(10) unsigned | NO |  | NULL |    | 
| host_id  | int(10) unsigned | NO | MUL | NULL |    | 
+---------------+------------------+------+-----+---------+----------------+ 

mysql> describe cve; 
+---------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+------------------+------+-----+---------+----------------+ 
| cve_id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| cve  | varchar(15)  | NO |  | NULL |    | 
| vuln_id | int(10) unsigned | NO | MUL | NULL |    | 
| year | int(4) unsigned | YES |  | NULL |    | 
+---------+------------------+------+-----+---------+----------------+ 

mysql> describe host; 
+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| host_id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| ip_addr  | int(10) unsigned | NO |  | NULL |    | 
+--------------+------------------+------+-----+---------+----------------+ 

내가 출력 심각도가 2009 년보다 적은 취약점이 호스트의 수를 원하는 = 3 해당 연도는 vuln_id FK와 관련된 취약점과 관련된 CVE에 포함되어 있습니다. 이 취약점은 심각도가 있으며 host_id FK를 사용하여 호스트에 연결됩니다. 이것은 나에게 좋은 시작이다 취약점이있는 호스트의 총 수 2009보다 이전 버전을 알려줍니다

mysql> select count(distinct ip_addr) from host H 
    inner join vulnerability V on H.host_id = V.host_id 
    inner join CVE C on C.vuln_id = V.vuln_id 
    where V.severity = 3 and C.year < 2009; 
+-------------------------+ 
| count(distinct ip_addr) | 
+-------------------------+ 
|     5071 | 
+-------------------------+ 

: 여기에 지금까지 가지고있는 것입니다. 그러나 나는 한 걸음 더 나아가 50 개 이상의 취약성을 가진 호스트 만 포함시키고 싶다. 어떻게해야할지 모르겠습니다. 호스트 테이블의 각 호스트 항목에는 여러 가지 상응하는 취약점 항목이 있습니다. 내 where 절에 무언가를 추가 할 필요가 있다고 가정하지만, 나는 붙어있다.

미리 감사드립니다. 더 많은 정보가 필요하면 알려주십시오.

답변

2

GROUP BYHAVING를 사용해보십시오 :

SELECT ip_addr 
FROM host AS H 
INNER JOIN vulnerability AS V 
    ON H.host_id = V.host_id 
INNER JOIN CVE AS C 
    ON C.vuln_id = V.vuln_id 
WHERE V.severity = 3 AND C.year < 2009 
GROUP BY ip_addr 
HAVING COUNT(DISTINCT vuln_id) >= 50 

바로 카운트가 다른 쿼리 내부에 위의 질의 포장 얻으려면 : 응, 간단한 그

SELECT COUNT(*) FROM 
(
    SELECT ip_addr 
    FROM host AS H 
    -- etc... same query as above 
) T1 
+0

를? 감사. – Magicked

관련 문제