[英]Mysql Query with multiple subqueries with group by distinct condition
嗨,我是一個MySQL開發人員薄弱的PHP開發人員。 下面是表vulnerability
。
+-----------------------------------------------------------------------------------------------+
| id | webisite_id | low_count| high_count | medium_count | date_time | vul_date |
+-----------------------------------------------------------------------------------------------+
| 20 | 6 | 1 | 1 | 1 | 2018-07-04 09:14:04 | 2018-02-01 |
| 19 | 6 | 30 | 30 | 30 | 2018-07-04 09:13:38 | 2018-01-30 |
| 18 | 6 | 1 | 1 | 1 | 2018-07-04 09:13:16 | 2018-01-01 |
+-----------------------------------------------------------------------------------------------+
該表表示數據庫中每個網站的低,中,高-漏洞計數。 我們可以為每個網站輸入盡可能多的條目。 但是,與網站唯一相關的條目是每個月的最新條目(基於vul_date
)。
在這里,我需要幫助,我希望通過查詢獲取過去1年中每個月每個網站的低,高,中位數的總和,例如-> id
1的網站具有1、2、3的低,高,中位數漏洞,在6月和-> id
2的漏洞分別具有7、8、9的結果應該是6月8、10、12的結果。應該像過去一年的每個月那樣獲得結果。 如果沒有條目,則應為0。
請注意,條目應為vul_date
的最大值,並且如果站點在同一vul_date
上具有多個條目,則獲取最新的date_time
條目。
我試圖盡可能簡單地寫問題。 希望問題得到理解。 請幫我
提前致謝。
我認為以下查詢將為您工作。
SELECT
SUM(low_count),
SUM(medium_count),
SUM(high_count),
MONTH(vul_date)
FROM
(SELECT
low_count, medium_count, high_count, vul_date, date_time
FROM
test
WHERE
(website_id , vul_date) IN (SELECT website_id, MAX(vul_date)
FROM test GROUP BY website_id , MONTH(vul_date))) t
WHERE
date_time IN (SELECT MAX(date_time) FROM test GROUP BY website_id , vul_date)
GROUP BY MONTH(vul_date);
它的作用是,首先查找每個網站ID(即您的最大vul_date)的最新進入月份。
SELECT website_id, MAX(vul_date)
FROM test GROUP BY website_id , MONTH(vul_date)
如果一個vul_date有多個條目,它將使用date_time從中選擇最大值。 最終,將每個月的網站分組匯總后,匯總所有網站日期。
您可以將上述查詢更改為在沒有任何網站條目的月份中獲得0值。
DROP TABLE IF EXISTS T;
CREATE TABLE T(id INT, website_id INT, low_count INT, high_count INT, medium_count INT, date_time DATETIME, vul_date DATE);
INSERT INTO T VALUES
( 20 , 6 , 1 , 1 , 1, '2018-07-04 09:14:04' , '2018-02-01'),
( 19 , 6 , 30, 30, 30, '2018-07-04 09:13:38' , '2018-01-30'),
( 18 , 6 , 2 , 2 ,2 , '2018-07-04 09:13:16' , '2018-01-01'),
( 17 , 6 , 2 , 2 ,2 , '2018-07-04 09:12:01' , '2018-01-01'),
( 90 , 1,1,2,3,'2017-07-05 01:00:00',' 2017-07-06'),
( 90 , 2,8,9,10,'2017-07-05 01:00:00',' 2017-07-06');
select coalesce(c.yyyymm,d.yyyymm) yyyymm,
coalesce(c.lo,0) lo,
coalesce(c.hi,0) hi,
coalesce(c.med,0) med
from
(
SELECT concat(year(a.vul_date),'-',month(a.vul_date)) yyyymm,
SUM(LOW_COUNT) lo,SUM(HIGH_COUNT) hi,sum(medium_count) med
from
(
select website_id,date_time,vul_date
from t
where date_time = (select max(date_time) from t t1 where t1.website_id = t.website_id and t1.vul_date = t.vul_date)
) a
join
(select website_id, date_time,vul_date,
LOW_COUNT,HIGH_COUNT,medium_count
from t) b
on b.website_id = a.website_id and b.date_time = a.date_time
group by concat(year(a.vul_date),'-',month(a.vul_date))
) c
right join
(select distinct concat(year(dte),'-',month(dte)) yyyymm from dates d
where dte between date_sub(now(), interval 1 year) and now()
) d on d.yyyymm = c.yyyymm
;
子查詢a獲取具有最新data_time的vul_date,然后將其自我連接,聚合,然后使用對日期/日歷表的正確連接來填充缺少的日期。 如果您沒有日期/日歷,則對於這種運動螺母會很有用,因此您可以在SO中找到其他選擇。
結果
+---------+------+------+------+
| yyyymm | lo | hi | med |
+---------+------+------+------+
| 2017-7 | 9 | 11 | 13 |
| 2017-8 | 0 | 0 | 0 |
| 2017-9 | 0 | 0 | 0 |
| 2017-10 | 0 | 0 | 0 |
| 2017-11 | 0 | 0 | 0 |
| 2017-12 | 0 | 0 | 0 |
| 2018-1 | 32 | 32 | 32 |
| 2018-2 | 1 | 1 | 1 |
| 2018-3 | 0 | 0 | 0 |
| 2018-4 | 0 | 0 | 0 |
| 2018-5 | 0 | 0 | 0 |
| 2018-6 | 0 | 0 | 0 |
| 2018-7 | 0 | 0 | 0 |
+---------+------+------+------+
13 rows in set (0.04 sec)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.