2012-11-14 16 views
1

我正在MYSQL中進行一些數據分析,希望以下是可能的。在MySql/GROUP BY中創建和絃圖矩陣語法

我有一張如下所示的用戶博客主題的表格。我有一個共有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中嗎?如果是這樣,那麼最簡單的方法是什麼?

回答

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

你不需要創建一個重複的表,只需做...從table_a一個連接table_a b ... –

1

它應該是可能的,主要問題變成執行,正如你所提到的是困難的部分。

要開始你正確的路徑,你可以嘗試創建一個包含所有主題的臨時表。

另一個小技巧是,你可以從該表和JOIN做一個FROM該表創建一組所有組合。然後,通過在第一個版本上執行GROUP BY,您可以從第二個版本獲取結果。

最後,如果您希望這是模塊化的,則可能最容易做查詢組合,以允許您返回具有命名列的結果集。