[英]MySQL query GROUP BY two columns
我需要有關MySQL查詢的幫助
我有這個場景:
表A
-page_id
-rev_id
-日期
一個page_id可以有多個rev_id
表B
-rev_id
-字
我每個修訂版都有什么用
我需要為每個日期返回每個page_id中上一個rev_id中包含的單詞數量
例:
table A
page_id | rev_id | date
---------------------------------
1 | 231 | 2002-01-01
2 | 345 | 2002-10-12
1 | 324 | 2002-10-13
3 | 348 | 2003-01-01
-
table B
rev_id | words
---------------
231 | 'ask'
231 | 'the'
231 | 'if'
345 | 'ask'
324 | 'ask'
324 | 'if'
348 | 'who'
此處編輯了神奇的sql,以顯示其計算方式{page_id:[words]}
date | count(words)
--------------------------
2002-01-01 | 3 { 1:[ask, the, if] }
2002-10-12 | 4 { 1:[ask, the, if], 2:[ask] }
2002-10-13 | 3 { 1:[ask, if], 2:[ask] }
2003-01-01 | 4 { 1:[ask, if], 2:[ask], 3:[who] }
我做了這個查詢,但是我的日期是固定的,我需要表修訂中包含的所有日期:
SELECT SUM(q)
FROM (
SELECT COUNT(equation) q
FROM revision r, equation e
WHERE r.rev_id in (
SELECT max(rev_id)
FROM revision
WHERE date < '2006-01-01'
GROUP BY page_id
)
AND r.rev_id = e.rev_id
GROUP BY date
) q;
我的朋友幫助我創建查詢來解決我的問題!
select s.date, count(words) from
(select d.date, r.page_id, max(r.rev_id) as rev_id
from revision r, (select distinct(date) from revision) d
where d.date >= r.date group by d.date, r.page_id) s
join words e on e.rev_id = s.rev_id
group by s.date;
我認為這是一個基本的join
和group by
:
select a.date, count(*)
from a join
b
on a.rev_id = b.rev_id
group by a.date;
編輯:
哦,我想我明白了。 這是累積的事情。 這使其變得更加復雜。
select d.date,
(select count(*)
from a join
b
on a.rev_id = b.rev_id
where a.date <= d.date and
a.rev_id = (select max(a2.rev_id) from a a2 where a2.date = a.date and a2.date <= d.date)
) as cnt
from (select date from a) d;
但是由於相關子句的嵌套,在MySQL中這是行不通的。 因此,我們可以將邏輯重構為:
select a.date, count(*)
from (select a.*,
(select max(a2.rev_id)
from a a2
where a2.date <= a.date and a2.page_id = a.page_id
) as last_rev_id
from a
) a join
b
on a.last_rev_id = b.rev_id
group by a.date;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.