我正在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中是否可以使用其中任何一个?如果是这样,最简单的方法是什么?
答案 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
,您可以获得从第二个版本获得结果的查询。
最后,如果您希望这是模块化的,那么最简单的方法是进行查询组合,以允许您返回带有命名列的结果集。