2012-04-03 117 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