在MySql / GROUP BY语法中创建和弦图矩阵

时间:2012-11-14 19:52:10

标签: mysql statistics analytics chord-diagram table-statistics

我正在MYSQL中进行一些数据分析,并希望以下是可能的。

我有一个记录用户博客主题的表格如下。我总共有25个主题,并希望对此进行抽象,以便我们以后可以添加主题,而不必重做查询(如果可能):

-----------------------
| user_id |  topic    |
-----------------------
|   01    |  art      | 
|   01    |  cooking  |
|   02    |  art      | 
|   03    |  outdoors |
|   03    |  art      |
|   03    |  cooking  |
-----------------------

为了从这些数据创建一个和弦图(http://bl.ocks.org/4062006),我需要分析任意两个主题之间的关系,或者通过两个主题对行进行分组,或者通过创建一个矩阵:

-----------------------------------------
| topic_combo            |  user_cnt    |
-----------------------------------------
|   art + cooking        |  2           | 
|   art + outdoors       |  1           |
|   cooking + outdoors   |  1           | 
-----------------------------------------

或者,甚至更好......

---------------------------------------------
|          |  art  |  cooking  |  outdoors  |
---------------------------------------------
| art      |   3   |    2      |     1      |
| cooking  |   2   |    2      |     1      |
| outdoors |   1   |    1      |     1      |
---------------------------------------------

MYSQL中是否可以使用其中任何一个?如果是这样,最简单的方法是什么?

2 个答案:

答案 0 :(得分:3)

嗯,我不知道这是不是最好的方式,但至少它是一个,直到你得到一个更好的答案。使用Guvante提到的JOIN和GROUP BY。

SELECT a.topic AS at, b.topic AS bt, COUNT(*) AS c FROM a JOIN a AS b ON a.user_id=b.user_id GROUP BY a.topic, b.topic;

这将产生如下输出:

at          bt          c
-----------------------------
art         art         3
art         cooking     2
art         outdoors    1
cooking     art         2
cooking     cooking     2
cooking     outdoors    1
outdoors    art         1
outdoors    cooking     1
outdoors    outdoors    1

您可以将其转换为矩阵,例如通过PHP

while($data = mysql_fetch_object($sql)) {
  $matrix[$data->at][$data->bt] = $data->c;
}

修改:在提示朋友后,删除了评论中提到的重复项。

答案 1 :(得分:1)

应该有可能,主要问题就是实施,正如你所提到的那样是困难的部分。

要从正确的路径开始,您可以尝试创建包含所有主题的临时表。

另一个小问题是你可以从该表中FROM和同一个表JOIN创建一组所有组合。然后通过在第一个版本上执行GROUP BY,您可以获得从第二个版本获得结果的查询。

最后,如果您希望这是模块化的,那么最简单的方法是进行查询组合,以允许您返回带有命名列的结果集。