给定 4 个表,每个表包含项目并代表一组,如何获得绘制维恩图所需的每个隔间中的项目数,如下所示。计算应在 MySQL 服务器中进行,避免将项目传输到应用程序服务器。
示例表:
s1: s2: s3: s4:
+------+ +------+ +------+ +------+
| item | | item | | item | | item |
+------+ +------+ +------+ +------+
| a | | a | | a | | a |
+------+ +------+ +------+ +------+
| b | | b | | b | | c |
+------+ +------+ +------+ +------+
| c | | c | | d | | d |
+------+ +------+ +------+ +------+
| d | | e | | e | | e |
+------+ +------+ +------+ +------+
| ... | | ... | | ... | | ... |
现在,我想我会计算一些设定的权力。一些与I
to s1
、II
to s2
、III
tos3
和IV
to相对应的例子s4
:
如果我重新解释sx
为一个集合,我会写:
|s1 ∩ s2 ∩ s3 ∩ s4|
- 中间的白色 25|(s1 ∩ s2 ∩ s4) \ s3|
- 右下方相对于中心的白色 15|(s1 ∩ s4) \ (s2 ∪ s3)|
- 底部的白色 5|s1 \ (s2 ∪ s3 ∪ s4)|
- 蓝底深蓝60- ……直到 15 点。
如何在 MySQL 服务器上有效地计算这些权力?MySQL 是否提供了辅助计算的函数?
一种天真的方法是运行 1 的查询。
SELECT count(*) FROM(
SELECT item FROM s1
INTERSECT
SELECT item FROM s2
INTERSECT
SELECT item FROM s3
INTERSECT
SELECT item FROM s4);
以及对 2 的另一个查询。
SELECT count(*) FROM(
SELECT item FROM s1
INTERSECT
SELECT item FROM s2
INTERSECT
SELECT item FROM s4
EXCEPT
SELECT item FROM s3);
以此类推,产生 15 个查询。