首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关系chord图的Inter

关系chord图的Inter
EN

Stack Overflow用户
提问于 2013-02-01 17:17:35
回答 1查看 136关注 0票数 1

我有一个问题。这对你来说可能很容易。

我正在尝试构建一个类似这样的d3js chord图(http://bl.ocks.org/4062006):

不过,我是从mysql数据库中获取数据的

我的表看起来像这样:

代码语言:javascript
复制
id gender_taker gender_giver
1     F            M
2     M            M
3     F            M
4     F            F

我希望输出如下所示:

代码语言:javascript
复制
gender_giver gender_taker count(*)
M            F            2
M            M            1
F            F            1

这很简单,可以通过以下方式生成:

代码语言:javascript
复制
SELECT gender_giver, gender_taker, COUNT(*) FROM data WHEREclauses GROUP BY gender_taker, gender_giver

但是我有另一个问题,我有另外两个表,看起来像这样:表1:

代码语言:javascript
复制
id entryid gender_taker
1   2       F
2   2       M
3   3       F

表2:

代码语言:javascript
复制
id entryid gender_giver
1   1       M
2   1       F
3   2       M

条目id基本上是第一个表的id,这表明Table2和Table3只是table1的子集

如果您将这三个表组合在一起,它可能如下所示:

代码语言:javascript
复制
id gender_taker gender_giver
1     F            M,M,F
2     M,F,M        M,M
3     F,F          M
4     F            F

因此,对于chord图,我希望将所有这些表都考虑在内,最终给出如下内容:

代码语言:javascript
复制
gender_giver gender_taker count(*)
M            F            6           
M            M            4
F            F            2
F            M            0

请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-01 18:32:48

代码语言:javascript
复制
DROP TABLE IF EXISTS core;
CREATE TABLE core
(entry_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,gender_taker CHAR(1) NOT NULL
,gender_giver CHAR(1) NOT NULL
);

INSERT INTO core VALUES
(1     ,'F','M'),
(2,'M','M'),
(3,'F','M'),
(4,'F','F');

DROP TABLE IF EXISTS table1;
CREATE TABLE table1
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,entryid INT NOT NULL
,gender_taker CHAR(1) NOT NULL
);

INSERT INTO table1 VALUES
(1   ,2       ,'F'),
(2   ,2       ,'M'),
(3   ,3       ,'F');


DROP TABLE IF EXISTS table2;
CREATE TABLE table2
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,entryid INT NOT NULL
,gender_giver CHAR(1) NOT NULL
);

INSERT INTO table2 VALUES

(1   ,1       ,'M'),
(2   ,1       ,'F'),
(3   ,2       ,'M');

SELECT entry_id
     , GROUP_CONCAT(gender_taker) gender_takers
     , GROUP_CONCAT(gender_giver) gender_givers
  FROM 
     ( SELECT * FROM core
       UNION
       SELECT entryid,gender_taker,NULL FROM table1
       UNION
       SELECT entryid,NULL,gender_giver FROM table2
     ) x
 GROUP 
    BY entry_id;
+----------+---------------+---------------+
| entry_id | gender_takers | gender_givers |
+----------+---------------+---------------+
|        1 | F             | M,M,F         |
|        2 | M,F,M         | M,M           |
|        3 | F,F           | M             |
|        4 | F             | F             |
+----------+---------------+---------------+

SELECT a.gender taker
     , b.gender giver
     , COUNT(*)
  FROM 
     (
       SELECT entry_id,'taker' role, gender_taker gender FROM core
       UNION ALL
       SELECT entry_id,'giver', gender_giver FROM core
       UNION ALL
       SELECT entryid,'taker',gender_taker FROM table1
       UNION ALL
       SELECT entryid,'giver',gender_giver FROM table2
     ) a
  JOIN
     (
       SELECT entry_id,'taker' role, gender_taker gender FROM core
       UNION ALL
       SELECT entry_id,'giver', gender_giver FROM core
       UNION ALL
       SELECT entryid,'taker',gender_taker FROM table1
       UNION ALL
       SELECT entryid,'giver',gender_giver FROM table2
     ) b
    ON b.entry_id = a.entry_id
   AND b.role = 'giver'
   AND a.role = 'taker'
 GROUP 
    BY taker
     , giver;
+-------+-------+----------+
| taker | giver | COUNT(*) |
+-------+-------+----------+
| F     | F     |        2 |
| F     | M     |        6 |
| M     | M     |        4 |
+-------+-------+----------+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14643016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档