1

我在 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中这些都可能吗?如果是这样,最简单的方法是什么?

4

2 回答 2

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;
}

编辑:在朋友的提示后删除了评论中提到的重复。

于 2012-11-14T20:24:41.777 回答
1

应该有可能,主要问题变成了实现,正如您所提到的,这是困难的部分。

为了让您走上正确的道路,您可以尝试创建一个包含所有主题的临时表。

另一个花絮是你可以FROM从那个表和JOIN同一个表中做一个来创建一组所有组合。然后通过GROUP BY在第一个版本上执行,您可以有一个从第二个版本获取结果的查询。

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

于 2012-11-14T20:04:46.360 回答