2012-04-03 2 views
3

J'ai une table qui contient des données sur le noeud visité. Il est possible qu'un noeud puisse être visité plusieurs fois. Pour cela, j'ai une autre table qui contient les données du noeud visité, du noeud visité avant et du noeud visité après. Je voudrais maintenant reconstruire le chemin dans l'ordre de visite en utilisant MySQL. Je n'arrive pas à comprendre comment faire une requête pour cela, alors je demande de l'aide.Reconstruction de chemin de noeud SQL

Exemple

Disons que quelqu'un a visité ces noeuds dans cet ordre:

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

Les tables ressemble à ceci:

Visites

+---------+-------------------------------+----------+------------+ 
| 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   | 
+---------+-------------------------------+----------+------------+ 

Revisite

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

Je voudrais construire une requête qui retourne le chemin sous la forme d'une chaîne ou d'une liste de nœuds comme ceci:

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

ou

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

Toute aide sera grandement appréciée.

+2

et vous ne pouvez pas changer le design? il vaudrait mieux simplement stocker toutes les visites et visites passées dans la table 'visites' sans la colonne' view_count' ... – Aprillion

+0

Seconding that. Il est beaucoup plus facile d'obtenir vos statistiques à partir d'un chemin brut, que l'inverse. –

+0

+ dans ce design, si vous visitez 6> 4> 7 3 fois, vous ne pouvez pas les distinguer (les conditions de jointure vont tripler les reprises) – Aprillion

Répondre

2

changer votre conception d'avoir 1 table visites:

 
+----+------+------+ 
| 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 | 
+----+------+------+ 


vous pouvez sélectionner view_count comme ceci:

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

et le chemin comme ceci:

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

Merci pour votre réponse. Changer la conception fonctionnera bien. – brozo

Questions connexes