首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql:从多个连接表中选择特定数据

Mysql:从多个连接表中选择特定数据
EN

Stack Overflow用户
提问于 2011-03-04 05:19:19
回答 1查看 641关注 0票数 1

我很难理解这个select语句。数据来自3个表(为了更容易阅读,我去掉了所有不必要的数据):

代码语言:javascript
复制
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。年份包含在CVE中,它与vuln_id FK的漏洞相关。该漏洞具有严重程度,并通过host_id FK绑定到主机。这是我到目前为止所知道的:

代码语言:javascript
复制
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 |
+-------------------------+

这告诉我具有2009年以前的漏洞的主机总数,这是一个很好的开始。然而,我想更进一步,只包括那些有50个或更多漏洞的主机。我不知道该怎么做。host表中的每个主机条目都有多个对应的漏洞条目。我假设我需要在where子句中添加一些东西,但是我被卡住了。

提前谢谢。如果需要更多信息,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-04 05:22:12

尝试使用GROUP BYHAVING

代码语言:javascript
复制
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

要只获取计数,请将上面的查询包装在另一个查询中:

代码语言:javascript
复制
SELECT COUNT(*) FROM
(
     SELECT ip_addr
     FROM host AS H
     -- etc... same query as above
) T1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5186683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档