簡體   English   中英

mysql加入后結果明顯

[英]mysql distinct results after join

我對以下查詢感到很頭疼。 我認為問題是AND部分返回的結果重復。 Mysql對於以下查詢返回14個結果,但實際上只是2個不同的結果。

select date_format(published,'%Y-%m'),severity,count(severity) 
  FROM nvdcve 
  LEFT JOIN nvdproducts USING(cve_id) 
where (published >= '2013-06-01') 
  AND  (
      (nvdproducts.company='linux' and nvdproducts.product='linux_kernel 
         AND nvdproducts.version IN (SELECT Kernel from Versions.VIEW_kernel))
  OR (nvdproducts.company='apache' and nvdproducts.product='http_server' 
         AND nvdproducts.version IN (SELECT Httpd from Versions.VIEW_httpd))
  OR (nvdproducts.company='sendmail' and nvdproducts.product='sendmail'  AND nvdproducts.version IN (SELECT Sendmail from Versions.VIEW_sendmail))
  OR (nvdproducts.company='mysql' and nvdproducts.product='mysql' AND nvdproducts.version IN (SELECT Mysqld from Versions.VIEW_mysqld)) 
  OR (nvdproducts.company='proftpd' and nvdproducts.product='proftpd' AND nvdproducts.version IN (SELECT Proftpd from Versions.VIEW_proftpd))
  OR (nvdproducts.company='perl' and nvdproducts.product='perl' AND nvdproducts.version IN (SELECT Perl from Versions.VIEW_perl))
  OR (nvdproducts.company='openssl' and nvdproducts.product='openssl' AND nvdproducts.version IN (SELECT Sslinuse from Versions.VIEW_sslinuse))
 ) 
group by date_format(published,'%Y-%m'),severity;

此摘要查詢給出此結果。

+--------------------------------+----------+-----------------+
| date_format(published,'%Y-%m') | severity | count(severity) |
+--------------------------------+----------+-----------------+
| 2013-06                        | MEDIUM   |              14 |
+--------------------------------+----------+-----------------+

我能得到的最接近的是獲取行,但是我丟失了計數並添加了cve_id,這不是我想要的。

    select distinct cve_id,date_format(published,'%Y-%m'),severity 
      FROM nvdnew.nvdcve 
 LEFT JOIN nvdproducts USING(cve_id) 
     where (published > '2013-05-31') 
       and published < '2013-07-01' 
       AND (
           (nvdproducts.company='linux' and nvdproducts.product='linux_kernel' AND nvdproducts.version IN (SELECT Kernel from Versions.VIEW_kernel))
         OR (nvdproducts.company='apache' and nvdproducts.product='http_server' AND nvdproducts.version IN (SELECT Httpd from Versions.VIEW_httpd))
         OR (nvdproducts.company='sendmail' and nvdproducts.product='sendmail'  AND nvdproducts.version IN (SELECT Sendmail from Versions.VIEW_sendmail)) 
         OR (nvdproducts.company='mysql' and nvdproducts.product='mysql' AND nvdproducts.version IN (SELECT Mysqld from Versions.VIEW_mysqld))      
         OR (nvdproducts.company='proftpd' and nvdproducts.product='proftpd' AND nvdproducts.version IN (SELECT Proftpd from Versions.VIEW_proftpd))                                          
         OR (nvdproducts.company='perl' and nvdproducts.product='perl' AND nvdproducts.version IN (SELECT Perl from Versions.VIEW_perl))                                        
         OR (nvdproducts.company='openssl' and nvdproducts.product='openssl' AND nvdproducts.version IN (SELECT Sslinuse from Versions.VIEW_sslinuse)) 
   ) 
  order by published;

這是結果。

+---------------+--------------------------------+----------+
| cve_id        | date_format(published,'%Y-%m') | severity |
+---------------+--------------------------------+----------+
| CVE-2013-2128 | 2013-06                        | MEDIUM   |
| CVE-2013-1862 | 2013-06                        | MEDIUM   |
+---------------+--------------------------------+----------+
2 rows in set (0.00 sec)

將所有nvdproducts檢查移到子查詢中,以便可以在其中使用SELECT DISTINCT來防止重復。

SELECT DATE_FORMAT(published,'%Y-%m'), severity, COUNT(severity)
FROM nvdcve
LEFT JOIN (SELECT distinct cve_id
           FROM nvdproducts
           WHERE (nvdproducts.company='linux' and nvdproducts.product='linux_kernel' AND nvdproducts.version IN (SELECT Kernel from Versions.VIEW_kernel))
                 OR (nvdproducts.company='apache' and nvdproducts.product='http_server' AND nvdproducts.version IN (SELECT Httpd from Versions.VIEW_httpd))
                 OR (nvdproducts.company='sendmail' and nvdproducts.product='sendmail'  AND nvdproducts.version IN (SELECT Sendmail from Versions.VIEW_sendmail))
                 OR (nvdproducts.company='mysql' and nvdproducts.product='mysql' AND nvdproducts.version IN (SELECT Mysqld from Versions.VIEW_mysqld))
                 OR (nvdproducts.company='proftpd' and nvdproducts.product='proftpd' AND nvdproducts.version IN (SELECT Proftpd from Versions.VIEW_proftpd))
                 OR (nvdproducts.company='perl' and nvdproducts.product='perl' AND nvdproducts.version IN (SELECT Perl from Versions.VIEW_perl))
                 OR (nvdproducts.company='openssl' and nvdproducts.product='openssl' AND nvdproducts.version IN (SELECT Sslinuse from Versions.VIEW_sslinuse))
           ) nvdproducts
USING (cve_id)
WHERE published >= '2013-06-01'
GROUP BY DATE_FORMAT(published,'%Y-%m'), severity;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM