sql连接两个表并获得累积计数

时间:2016-12-22 13:54:23

标签: mysql sql

我有以下两个表,

表1:

id    document
--------------
A3  B2 
A3  B400 
A5  B100 
A5  B500   
A7  B200 
A8  B6 
A8  B2 
A8  C1    
A8  B3 

表2:

id    name
--------------
A1  Jack 
A2  Martin 
A3  Jack 
A4  Thomas 
A5  Jack 
A6  Thomas 
A7  Thomas 
A8  John 
A9  John 
A10 Kate 

我的过滤条件如下,应根据此列表比较document列和过滤器:

WHERE table1.document IN (B2,B400,B100,B500,B200,B6,B2,B3)

结果应该是:

name    freq
--------------
Jack    4
Thomas  1
John    3

解释: 首先,我在我的WHERE IN子句中过滤了我的文档。然后我看看剩下的文件' table1 id列的对应值,以及 在第二个表,第一列中查看id,并获取该ID的相应name并将其放入我的结果表中。
例如,A3重复两次,其对应的nameJack,所以到目前为止,Jack在freq列中的值为3,但是因为下一个id在 我的table1是A5,重复两次,其名称恰好也是Jack,因此jack的频率为4。 对于table1中的下一个值,A7具有相应的名称Thomas,因为A7重复一次,而没有其他id对应的名称是Thomas 不在我的table1列表中,那么Thomas的频率为1(我没有A4,也没有表1中的A6)。
在最后一个例子中,我在表1中重复了4次A8,但是,由于WHERE IN中的列表中没有包含C1,因此该条目将被过滤 并且没有计算,所以我剩下三个A8,其名称为John,然后它的值为3.

这是一个demo数据。

1 个答案:

答案 0 :(得分:4)

看似简单的JOIN GROUP BY可以提供所需的结果:

SELECT t2.name, COUNT(*) AS freq
FROM table1 AS t1
JOIN table2 AS t2 ON t1.id = t2.id
WHERE t1.document IN ('B2','B400','B100','B500','B200','B6','B2','B3')
GROUP BY t2.name;