2012-04-03 86 views
3

我有一張表,其中包含有關訪問過哪個節點的數據。有可能多次訪問一個節點。爲此我有另一個表,其中包含訪問節點,之前訪問的節點和之後訪問的節點的數據。我現在想用MySQL按訪問順序重建路徑。我似乎無法弄清楚如何對此進行查詢,所以我在這裏尋求幫助。SQL節點路徑重建

比方說有人在這個順序訪問這些節點:

4->5->6->7->4->6->10->12->7->15 

的表是這樣的:

訪問

+---------+-------------------------------+----------+------------+ 
| id  | user       | node  | view_count | 
+---------+-------------------------------+----------+------------+ 
| 1  | l3lie1frl77j135b3fehbjrli5 | 4  | 2   | 
+---------+-------------------------------+----------+------------+ 
| 2  | l3lie1frl77j135b3fehbjrli5 | 5  | 1   | 
+---------+-------------------------------+----------+------------+ 
| 3  | l3lie1frl77j135b3fehbjrli5 | 6  | 2   | 
+---------+-------------------------------+----------+------------+ 
| 4  | l3lie1frl77j135b3fehbjrli5 | 7  | 2   | 
+---------+-------------------------------+----------+------------+ 
| 5  | l3lie1frl77j135b3fehbjrli5 | 10  | 1   | 
+---------+-------------------------------+----------+------------+ 
| 6  | l3lie1frl77j135b3fehbjrli5 | 12  | 1   | 
+---------+-------------------------------+----------+------------+ 
| 7  | l3lie1frl77j135b3fehbjrli5 | 15  | 1   | 
+---------+-------------------------------+----------+------------+ 

重溫

+---------+-------------------------------+-------+----------------+-----------------+ 
| id  | user       | node | after_visiting | before_visiting | 
+---------+-------------------------------+-------+----------------+-----------------+ 
| 1  | l3lie1frl77j135b3fehbjrli5 | 4  |  7  |  6  | 
+---------+-------------------------------+-------+----------------+-----------------+ 
| 2  | l3lie1frl77j135b3fehbjrli5 | 6  |  4  |  10  | 
+---------+-------------------------------+-------+----------------+-----------------+ 
| 3  | l3lie1frl77j135b3fehbjrli5 | 7  |  12  |  15  | 
+---------+-------------------------------+-------+----------------+-----------------+ 

我想建立一個查詢將返回一個字符串的形式,或者類似這樣的節點列表中的路徑:

4,5,6,7,4,6,10,12,7,15 

+---------+--------+ 
| index | node | 
+---------+--------+ 
| 1 | 4 | 
+---------+--------+ 
| 2 | 5 | 
+---------+--------+ 
| 3 | 6 | 
+---------+--------+ 
| 4 | 7 | 
+---------+--------+ 
| 5 | 4 | 
+---------+--------+ 
| 6 | 6 | 
+---------+--------+ 
| 7 | 10 | 
+---------+--------+ 
| 8 | 12 | 
+---------+--------+ 
| 9 | 7 | 
+---------+--------+ 
| 10 | 15 | 
+---------+--------+ 

任何幫助將不勝感激。

+2

你不能改變設計?最好是將所有訪問和重訪存儲在沒有'view_count'列的'visits'表中... – Aprillion 2012-04-03 10:25:01

+0

借調。從其他方面來看,從原始路徑獲取統計數據要容易得多。 – 2012-04-03 10:27:21

+0

+在本設計中,如果您訪問6> 4> 7 3次,您無法區分它們(連接條件會重複三次) – Aprillion 2012-04-03 10:30:27

回答

2

改變你的設計有1臺訪問

 
+----+------+------+ 
| id | user | node | 
+----+------+------+ 
| 1 | xx | 4 | 
| 2 | xx | 5 | 
| 3 | xx | 6 | 
| 4 | xx | 7 | 
| 5 | xx | 4 | 
| 6 | xx | 6 | 
| 7 | xx | 10 | 
| 8 | xx | 12 | 
| 9 | xx | 7 | 
| 10 | xx | 15 | 
+----+------+------+ 


則可以選擇VIEW_COUNT這樣的:

select node, count(*) view_count 
from visits 
where user = :user 
group by node 

和路徑是這樣的:

select group_concat(node order by id separator ',') path 
from visits 
where name = :name 
+0

感謝您的回答。改變設計會很好。 – brozo 2012-04-03 10:38:03