2011-01-14 8 views
3

Ich möchte eine Brotkrume aus einer Pfadauflistungsspalte erstellen.Pfadauflistung mySQL Abfrage zum Erstellen einer Brotkrume

Hier ist ein Beispiel für den Datensatz, den ich habe.

https://spreadsheets.google.com/ccc?key=0AsGYQbeSAIgFdGRscFpsZFJpQUtfWGIwYWNUY2ktRHc&hl=en_GB&authkey=CPOuuogF

idwoeidparent_woeidcountry_codenamelanguageplace_typeancestry

Abstammung ist der aufgezählten Pfad, so wie 1/23424975/24554868/12602167/12696151 der Weg für Brighton in England.

Ich möchte in der Lage sein, einen Breadcrumb durch Abfragen der name Spalte zu erhalten, und alle Eltern erhalten.

dh. Welt, Europa, England, [Kreis], [Ort], [Region], [Ort]

([] = a placeholder)

Die Daten ändert sich nie, weshalb diese Tabelle Adjazenzliste und Pfad Aufzählung verwendet.

Antwort

5

Mehrere mögliche Ansätze. Ich gehe von dem, was du tun willst, zu dem, was ich dir vorschlage.

materialisierten Weg

Leider aufgezählt Pfad Herkunft (zum Beispiel Abstammungs) is expensive and tricky to do with SQL only (Abschnitt materialisierten Pfad finden "An employee FORD and chain of his supervisors" sehen). Wenn Sie den Pfad vor der Zeit haben und mit irgendeiner Art von Programmiersprache arbeiten kann, ist der einfachste Ansatz unter Verwendung eines IN Klausel:

SELECT * 
FROM woe 
WHERE ancestry IN (
    '1', 
    '1/23424975', 
    '1/23424975/24554868', 
    '1/23424975/24554868/12602167', 
    '1/23424975/24554868/12602167/12696151' 
) 
ORDER BY LEN(ancestry) 

Adjazenzliste

Oder Sie nutzen die Adjazenzliste nehmen könnte Aspekt Ihrer Daten und verwenden Sie stattdessen einen gemeinsamen Tabellenausdruck oder CONNECT BY abhängig von der Datenbank (dies ignoriert die Spalte ancestry). Siehe meine Frage über verschiedene Möglichkeiten von representing hierarchical data in an RDBMS für Informationen über die Arbeit mit Adjazenzliste Abfrage von Abstammung (siehe Database Specific Notes Abschnitt am Ende der Frage).

Nested Set

Sie schreiben Ihre Daten nicht ändern und Sie Vorfahren abfragen möchten. Eine geschachtelte Mengenrepräsentation ist der perfekte Ansatz in dieser Situation, da das Abrufen der Informationen, die Sie nur mit SQL verwenden möchten, einfach ist, mit jeder Datenbank funktioniert und sehr billig ist. Nachteil ist, dass Bewegungen und Einsätze teuer sind. Managing Hierarchical Data in MySQL ist wahrscheinlich die beste Erklärung, die ich dafür bereitstellen kann, wie es funktioniert.

Nested Set ist das, was ich gegeben Ihre Daten verwenden würde, was Sie wollen, und dass sie sich nicht verändert.